Análise de variância (ANOVA) - Preços de imóveis¶
Bibliotecas¶
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from math import ceil
from itertools import zip_longest
import scipy.stats as stats
import statsmodels.formula.api as smf
import scikit_posthocs as sp
import numpy as np
sns.set_theme(style="whitegrid", palette="pastel")
Análise exploratória¶
Análise inicial¶
df = pd.read_csv('AmesHousing.csv')
print('Número de linhas:', len(df))
Número de linhas: 2930
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2930 entries, 0 to 2929 Data columns (total 82 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Order 2930 non-null int64 1 PID 2930 non-null int64 2 MS SubClass 2930 non-null int64 3 MS Zoning 2930 non-null object 4 Lot Frontage 2440 non-null float64 5 Lot Area 2930 non-null int64 6 Street 2930 non-null object 7 Alley 198 non-null object 8 Lot Shape 2930 non-null object 9 Land Contour 2930 non-null object 10 Utilities 2930 non-null object 11 Lot Config 2930 non-null object 12 Land Slope 2930 non-null object 13 Neighborhood 2930 non-null object 14 Condition 1 2930 non-null object 15 Condition 2 2930 non-null object 16 Bldg Type 2930 non-null object 17 House Style 2930 non-null object 18 Overall Qual 2930 non-null int64 19 Overall Cond 2930 non-null int64 20 Year Built 2930 non-null int64 21 Year Remod/Add 2930 non-null int64 22 Roof Style 2930 non-null object 23 Roof Matl 2930 non-null object 24 Exterior 1st 2930 non-null object 25 Exterior 2nd 2930 non-null object 26 Mas Vnr Type 1155 non-null object 27 Mas Vnr Area 2907 non-null float64 28 Exter Qual 2930 non-null object 29 Exter Cond 2930 non-null object 30 Foundation 2930 non-null object 31 Bsmt Qual 2850 non-null object 32 Bsmt Cond 2850 non-null object 33 Bsmt Exposure 2847 non-null object 34 BsmtFin Type 1 2850 non-null object 35 BsmtFin SF 1 2929 non-null float64 36 BsmtFin Type 2 2849 non-null object 37 BsmtFin SF 2 2929 non-null float64 38 Bsmt Unf SF 2929 non-null float64 39 Total Bsmt SF 2929 non-null float64 40 Heating 2930 non-null object 41 Heating QC 2930 non-null object 42 Central Air 2930 non-null object 43 Electrical 2929 non-null object 44 1st Flr SF 2930 non-null int64 45 2nd Flr SF 2930 non-null int64 46 Low Qual Fin SF 2930 non-null int64 47 Gr Liv Area 2930 non-null int64 48 Bsmt Full Bath 2928 non-null float64 49 Bsmt Half Bath 2928 non-null float64 50 Full Bath 2930 non-null int64 51 Half Bath 2930 non-null int64 52 Bedroom AbvGr 2930 non-null int64 53 Kitchen AbvGr 2930 non-null int64 54 Kitchen Qual 2930 non-null object 55 TotRms AbvGrd 2930 non-null int64 56 Functional 2930 non-null object 57 Fireplaces 2930 non-null int64 58 Fireplace Qu 1508 non-null object 59 Garage Type 2773 non-null object 60 Garage Yr Blt 2771 non-null float64 61 Garage Finish 2771 non-null object 62 Garage Cars 2929 non-null float64 63 Garage Area 2929 non-null float64 64 Garage Qual 2771 non-null object 65 Garage Cond 2771 non-null object 66 Paved Drive 2930 non-null object 67 Wood Deck SF 2930 non-null int64 68 Open Porch SF 2930 non-null int64 69 Enclosed Porch 2930 non-null int64 70 3Ssn Porch 2930 non-null int64 71 Screen Porch 2930 non-null int64 72 Pool Area 2930 non-null int64 73 Pool QC 13 non-null object 74 Fence 572 non-null object 75 Misc Feature 106 non-null object 76 Misc Val 2930 non-null int64 77 Mo Sold 2930 non-null int64 78 Yr Sold 2930 non-null int64 79 Sale Type 2930 non-null object 80 Sale Condition 2930 non-null object 81 SalePrice 2930 non-null int64 dtypes: float64(11), int64(28), object(43) memory usage: 1.8+ MB
df.head()
| Order | PID | MS SubClass | MS Zoning | Lot Frontage | Lot Area | Street | Alley | Lot Shape | Land Contour | ... | Pool Area | Pool QC | Fence | Misc Feature | Misc Val | Mo Sold | Yr Sold | Sale Type | Sale Condition | SalePrice | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 526301100 | 20 | RL | 141.0 | 31770 | Pave | NaN | IR1 | Lvl | ... | 0 | NaN | NaN | NaN | 0 | 5 | 2010 | WD | Normal | 215000 |
| 1 | 2 | 526350040 | 20 | RH | 80.0 | 11622 | Pave | NaN | Reg | Lvl | ... | 0 | NaN | MnPrv | NaN | 0 | 6 | 2010 | WD | Normal | 105000 |
| 2 | 3 | 526351010 | 20 | RL | 81.0 | 14267 | Pave | NaN | IR1 | Lvl | ... | 0 | NaN | NaN | Gar2 | 12500 | 6 | 2010 | WD | Normal | 172000 |
| 3 | 4 | 526353030 | 20 | RL | 93.0 | 11160 | Pave | NaN | Reg | Lvl | ... | 0 | NaN | NaN | NaN | 0 | 4 | 2010 | WD | Normal | 244000 |
| 4 | 5 | 527105010 | 60 | RL | 74.0 | 13830 | Pave | NaN | IR1 | Lvl | ... | 0 | NaN | MnPrv | NaN | 0 | 3 | 2010 | WD | Normal | 189900 |
5 rows × 82 columns
print('Número de features:', len(df.drop(columns=['SalePrice']).columns))
Número de features: 81
missing_values = df.isnull().sum()
missing_values = missing_values[missing_values > 0]
print('Valores faltantes ou iguais a zero')
missing_values.sort_values(ascending=False)
Valores faltantes ou iguais a zero
Pool QC 2917 Misc Feature 2824 Alley 2732 Fence 2358 Mas Vnr Type 1775 Fireplace Qu 1422 Lot Frontage 490 Garage Qual 159 Garage Cond 159 Garage Yr Blt 159 Garage Finish 159 Garage Type 157 Bsmt Exposure 83 BsmtFin Type 2 81 Bsmt Cond 80 Bsmt Qual 80 BsmtFin Type 1 80 Mas Vnr Area 23 Bsmt Full Bath 2 Bsmt Half Bath 2 BsmtFin SF 1 1 BsmtFin SF 2 1 Electrical 1 Total Bsmt SF 1 Bsmt Unf SF 1 Garage Area 1 Garage Cars 1 dtype: int64
Descrição das features¶
De acordo com a documentação apresentada no artigo original, as features representam o seguinte:
Variáveis numéricas contínuas (20 variáveis)
- Lot Frontage: Pés lineares da rua conectada à propriedade;
- Lot Area: Tamanho do lote em pés quadrados;
- Mas Vnr Area: Área do revestimento de alvenaria em pés quadrados;
- BsmtFin SF 1: Área acabada do tipo 1 no porão, em pés quadrados.
- BsmtFin SF 2: Área acabada do tipo 2 no porão, em pés quadrados;
- Bsmt Unf SF: Área não acabada do porão, em pés quadrados;
- Total Bsmt SF: Área total do porão, em pés quadrados;
- 1st Flr SF: Pés quadrados do primeiro andar;
- 2nd Flr SF: Pés quadrados do segundo andar;
- Low Qual Fin SF: Metros quadrados com acabamento de baixa qualidade (todos os andares);
- Gr Liv Area: Pés quadrados da área de convivência acima do nível do chão (térreo);
- Garage Area: Tamanho da garagem, em pés quadrados;
- Wood Deck SF: Área do deck de madeira, em pés quadrados;
- Open Porch SF: Área da varanda aberta, em pés quadrados;
- Enclosed Porch: Área da varanda fechada, em pés quadrados;
- 3-Ssn Porch: Área da varanda para três estações, em pés quadrados;
- Screen Porch: Área da varanda com tela, em pés quadrados;
- Pool Area: Área da piscina, em pés quadrados;
- Misc Val: Valor da feature avulsa;
- SalePrice: Preço de venda.
Variáveis numéricas discretas (14 variáveis)
- Order: Número da observação;
- Year Built: Ano de construção;
- Year Remod/Add: Ano de remodelação/adição;
- Bsmt Full Bath: Bsmt Full Bath;
- Bsmt Half Bath: Bsmt Half Bath;
- Full Bath: Banheiro completo;
- Half Bath: Meio banheiro;
- Bedroom: Quarto;
- Kitchen: Cozinha;
- TotRmsAbvGrd: Total de cômodos acima do nível do solo (não inclui banheiros);
- Fireplaces: Número de lareiras;
- Garage Yr Blt: Ano de construção da garagem;
- Garage Cars: Tamanho da garagem em capacidade de carros;
- Mo Sold: Mês da venda (MM);
- Yr Sold: Ano da venda (YYYY);
Variáveis categóricas nominais (23 variáveis)
- PID: Parcel Identicication Number ("Número de registro" do imóvel);
- MS SubClass: Identifica o tipo de residência envolvida na venda:
- 020: Casa térrea (1 andar), construções de 1946 em diante, todos os estilos.
- 030: Casa térrea (1 andar), construções de 1945 ou mais antigas.
- 040: Casa térrea (1 andar) com sótão acabado, todas as idades.
- 045: Casa de 1 andar e meio com sótão não acabado, todas as idades.
- 050: Casa de 1 andar e meio com sótão acabado, todas as idades.
- 060: Casa de 2 andares, construções de 1946 em diante.
- 070: Casa de 2 andares, construções de 1945 ou mais antigas.
- 075: Casa de 2 andares e meio, todas as idades.
- 080: Casa de múltiplos níveis ou split-level.
- 085: Casa com entrada split foyer (vestíbulo dividido).
- 090: Duplex (2 unidades), todos os estilos e idades.
- 120: Casa térrea (1 andar) em condomínio planejado (PUD), construções de 1946 em diante.
- 150: Casa de 1 andar e meio em condomínio planejado (PUD), todas as idades.
- 160: Casa de 2 andares em condomínio planejado (PUD), construções de 1946 em diante.
- 180: Condomínio planejado (PUD) de múltiplos níveis, incluindo split-level/split foyer.
- 190: Conversão para residência multifamiliar (2 unidades), todos os estilos e idades.
- MS Zoning: Identifica a classificação geral de zoneamento da venda.
- A: Agricultura.
- C: Comercial.
- FV: Residencial de Vila Flutuante.
- I: Industrial.
- RH: Residencial de Alta Densidade.
- RL: Residencial de Baixa Densidade.
- RP: Residencial de Baixa Densidade com Parque.
- RM: Residencial de Média Densidade.
- Street: Tipo de acesso rodoviário à propriedade.
- Grvl: Estrada de cascalho.
- Pave: Estrada pavimentada.
- Land Contour: Nível de planicidade do terreno.
- Lvl: Quase plano/nivelado.
- Bnk: Em declive — subida rápida e significativa da rua até a construção.
- HLS: Em encosta — inclinação significativa lateral.
- Low: Depressão.
- Lot Config: Configuração do lote.
- Inside: Lote interno.
- Corner: Lote de esquina.
- CulDSac: Lote em cul-de-sac.
- FR2: Frente em 2 lados da propriedade.
- FR3: Frente em 3 lados da propriedade.
- Alley: Tipo de acesso por viela.
- Grvl: Viela de cascalho.
- Pave: Viela pavimentada.
- NA: Sem acesso por viela.
- Neighborhood: Localizações físicas dentro dos limites da cidade de Ames.
- Blmngtn: Bloomington Heights.
- Blueste: Bluestem.
- BrDale: Briardale.
- BrkSide: Brookside.
- ClearCr: Clear Creek.
- CollgCr: College Creek.
- Crawfor: Crawford.
- Edwards: Edwards.
- Gilbert: Gilbert.
- Greens: Greens.
- GrnHill: Green Hills.
- IDOTRR: Iowa DOT e ferrovia.
- Landmrk: Landmark.
- MeadowV: Meadow Village.
- Mitchel: Mitchell.
- Names: North Ames.
- NoRidge: Northridge.
- NPkVill: Northpark Villa.
- NridgHt: Northridge Heights.
- NWAmes: Northwest Ames.
- OldTown: Old Town.
- SWISU: Sul e oeste da Universidade Estadual de Iowa.
- Sawyer: Sawyer.
- SawyerW: Sawyer West.
- Somerst: Somerset.
- StoneBr: Stone Brook.
- Timber: Timberland.
- Veenker: Veenker.
- Condition 1: Proximidade a diversas condições.
- Artery: Próximo a uma rua arterial.
- Feedr: Próximo a uma rua coletora.
- Norm: Normal.
- RRNn: A menos de 200 pés de uma ferrovia norte-sul.
- RRAn: Ao lado de uma ferrovia norte-sul.
- PosN: Próximo a característica externa positiva (parque, área verde, etc.).
- PosA: Ao lado de característica externa positiva.
- RRNe: A menos de 200 pés de uma ferrovia leste-oeste.
- RRAe: Ao lado de uma ferrovia leste-oeste.
- Condition 2: Proximidade a diversas condições (quando mais de uma está presente).
- Artery: Próximo a uma rua arterial.
- Feedr: Próximo a uma rua coletora.
- Norm: Normal.
- RRNn: A menos de 200 pés de uma ferrovia norte-sul.
- RRAn: Ao lado de uma ferrovia norte-sul.
- PosN: Próximo a característica externa positiva (parque, área verde, etc.).
- PosA: Ao lado de característica externa positiva.
- RRNe: A menos de 200 pés de uma ferrovia leste-oeste.
- RRAe: Ao lado de uma ferrovia leste-oeste.
- Bldg Type: Tipo de residência.
- 1Fam: Casa unifamiliar isolada.
- 2FmCon: Conversão para duas famílias (originalmente construída como unifamiliar).
- Duplx: Duplex.
- TwnhsE: Casa geminada (unidade de ponta).
- TwnhsI: Casa geminada (unidade interna).
- House Style: Estilo da residência.
- 1Story: Um andar.
- 1.5Fin: Um andar e meio com segundo nível acabado.
- 1.5Unf: Um andar e meio com segundo nível não acabado.
- 2Story: Dois andares.
- 2.5Fin: Dois andares e meio com segundo nível acabado.
- 2.5Unf: Dois andares e meio com segundo nível não acabado.
- SFoyer: Split foyer (vestíbulo dividido).
- SLvl: Split level (níveis divididos).
- Roof Style: Tipo de telhado.
- Flat: Plano.
- Gable: Duas águas.
- Gambrel: Quatro águas (estilo celeiro).
- Hip: Quatro águas inclinadas.
- Mansard: Mansarda.
- Shed: Inclinado.
- Roof Matl: Material do telhado.
- ClyTile: Telha de barro ou cerâmica.
- CompShg: Telha composta (comum).
- Membran: Membrana.
- Metal: Metal.
- Roll: Telhado de rolo.
- Tar&Grv: Cascalho e piche.
- WdShake: Telhas de madeira (rústicas).
- WdShngl: Telhas de madeira (lisas).
- Exterior 1: Revestimento externo da casa.
- AsbShng: Telhas de amianto.
- AsphShn: Telhas de asfalto.
- BrkComm: Tijolo comum.
- BrkFace: Tijolo aparente.
- CBlock: Bloco de concreto.
- CemntBd: Placa de cimento.
- HdBoard: Madeira dura.
- ImStucc: Estuque imitação.
- MetalSd: Revestimento metálico.
- Other: Outro.
- Plywood: Compensado.
- PreCast: Pré-moldado.
- Stone: Pedra.
- Stucco: Estuque.
- VinylSd: Revestimento de vinil.
- Wd Sdng: Revestimento de madeira.
- WdShing: Telhas de madeira.
- Exterior 2: Revestimento externo adicional da casa (caso haja mais de um material).
- AsbShng: Telhas de amianto.
- AsphShn: Telhas de asfalto.
- BrkComm: Tijolo comum.
- BrkFace: Tijolo aparente.
- CBlock: Bloco de concreto.
- CemntBd: Placa de cimento.
- HdBoard: Madeira dura.
- ImStucc: Estuque imitação.
- MetalSd: Revestimento metálico.
- Other: Outro.
- Plywood: Compensado.
- PreCast: Pré-moldado.
- Stone: Pedra.
- Stucco: Estuque.
- VinylSd: Revestimento de vinil.
- Wd Sdng: Revestimento de madeira.
- WdShing: Telhas de madeira.
- Mas Vnr Type: Tipo de revestimento de alvenaria.
- BrkCmn: Tijolo comum.
- BrkFace: Tijolo aparente.
- CBlock: Bloco de concreto.
- None: Nenhum.
- Stone: Pedra.
- Heating: Tipo de aquecimento.
- Floor: Fornalha de piso.
- GasA: Aquecimento forçado a gás com ar quente.
- GasW: Aquecimento a gás com água quente ou vapor.
- Grav: Fornalha de gravidade.
- OthW: Aquecimento com água quente ou vapor (exceto gás).
- Wall: Fornalha de parede.
- Central Air: Ar-condicionado central.
- N: Não.
- Y: Sim.
- Garage Type: Tipo/Localização da garagem.
- 2Types: Mais de um tipo de garagem.
- Attchd: Anexa à casa.
- Basment: Garagem no porão.
- BuiltIn: Integrada (parte da casa, geralmente com cômodo acima).
- CarPort: Cobertura para carro.
- Detchd: Separada da casa.
- NA: Sem garagem.
- Misc Feature: Características diversas não cobertas em outras categorias.
- Elev: Elevador.
- Gar2: Segunda garagem (se não descrita na seção de garagem).
- Othr: Outra característica.
- Shed: Galpão (com mais de 100 pés quadrados).
- TenC: Quadra de tênis.
- NA: Nenhuma.
- Sale Type: Tipo de venda.
- WD: Escritura de garantia — Venda convencional.
- CWD: Escritura de garantia — Pagamento à vista.
- VWD: Escritura de garantia — Financiamento VA (Veterans Affairs).
- New: Casa recém-construída e vendida.
- COD: Escritura de oficial judicial/sucessão.
- Con: Contrato com 15% de entrada e termos regulares.
- ConLw: Contrato com baixa entrada e baixo juro.
- ConLI: Contrato com baixo juro.
- ConLD: Contrato com baixa entrada.
- Oth: Outro tipo de venda.
- Sale Condition: Condição de venda.
- Normal: Venda normal.
- Abnorml: Venda anormal (troca, execução hipotecária, venda rápida).
- AdjLand: Compra de terreno adjacente.
- Alloca: Alocação — duas propriedades vinculadas com escrituras separadas (ex.: condomínio com unidade de garagem).
- Family: Venda entre membros da família.
- Partial: Casa não finalizada quando foi avaliada pela última vez (associada a novas construções).
Variáveis categóricas ordinais (23 variáveis)
- Lot Shape: Formato geral do lote.
- Reg: Regular.
- IR1: Levemente irregular.
- IR2: Moderadamente irregular.
- IR3: Irregular.
- Utilities: Tipos de utilidades disponíveis.
- AllPub: Todas as utilidades públicas (Eletricidade, Gás, Água e Esgoto).
- NoSewr: Eletricidade, Gás e Água (Fossa Séptica).
- NoSeWa: Apenas Eletricidade e Gás.
- ELO: Apenas Eletricidade.
- Land Slope: Inclinação do terreno.
- Gtl: Inclinação suave.
- Mod: Inclinação moderada.
- Sev: Inclinação acentuada.
- Overall Qual: Avaliação geral dos materiais e acabamentos da casa.
- 10: Excelente Superior.
- 9: Excelente.
- 8: Muito Bom.
- 7: Bom.
- 6: Acima da Média.
- 5: Médio.
- 4: Abaixo da Média.
- 3: Regular.
- 2: Ruim.
- 1: Muito Ruim.
- Overall Cond: Avaliação geral da condição da casa.
- 10: Excelente Superior.
- 9: Excelente.
- 8: Muito Bom.
- 7: Bom.
- 6: Acima da Média.
- 5: Médio.
- 4: Abaixo da Média.
- 3: Regular.
- 2: Ruim.
- 1: Muito Ruim.
- Exter Qual: Qualidade dos materiais externos.
- Ex: Excelente.
- Gd: Bom.
- TA: Médio/Comum.
- Fa: Regular.
- Po: Ruim.
- Exter Cond: Condição dos materiais externos.
- Ex: Excelente.
- Gd: Bom.
- TA: Médio/Comum.
- Fa: Regular.
- Po: Ruim.
- Bsmt Qual: Altura do porão.
- Ex: Excelente (100+ polegadas).
- Gd: Bom (90-99 polegadas).
- TA: Típico (80-89 polegadas).
- Fa: Regular (70-79 polegadas).
- Po: Ruim (<70 polegadas).
- NA: Sem porão.
- Bsmt Cond: Condição geral do porão.
- Ex: Excelente.
- Gd: Bom.
- TA: Típico (leve umidade permitida).
- Fa: Regular (umidade ou rachaduras).
- Po: Ruim (rachaduras severas, afundamento ou umidade).
- NA: Sem porão.
- Bsmt Exposure: Nível de exposição do porão.
- Gd: Boa exposição.
- Av: Exposição média.
- Mn: Exposição mínima.
- No: Sem exposição.
- NA: Sem porão.
- BsmtFin Type 1: Classificação da área acabada do porão.
- GLQ: Boas áreas habitáveis.
- ALQ: Áreas habitáveis médias.
- BLQ: Áreas habitáveis abaixo da média.
- Rec: Sala de recreação média.
- LwQ: Baixa qualidade.
- Unf: Não finalizado.
- NA: Sem porão.
- BsmtFin Type 2: Classificação adicional da área acabada do porão.
- GLQ: Boas áreas habitáveis.
- ALQ: Áreas habitáveis médias.
- BLQ: Áreas habitáveis abaixo da média.
- Rec: Sala de recreação média.
- LwQ: Baixa qualidade.
- Unf: Não finalizado.
- NA: Sem porão.
- HeatingQC: Qualidade e condição do aquecimento.
- Ex: Excelente.
- Gd: Bom.
- TA: Médio/Comum.
- Fa: Regular.
- Po: Ruim.
- Electrical: Sistema elétrico.
- SBrkr: Disjuntores padrão.
- FuseA: Caixa de fusíveis (60 AMP) com fiação moderna.
- FuseF: Caixa de fusíveis (60 AMP) com fiação regular.
- FuseP: Caixa de fusíveis (60 AMP) com fiação antiga.
- Mix: Misto.
- KitchenQual: Qualidade da cozinha.
- Ex: Excelente.
- Gd: Bom.
- TA: Médio/Comum.
- Fa: Regular.
- Po: Ruim.
- Functional: Funcionalidade da casa.
- Typ: Funcionalidade típica.
- Min1: Pequenas deduções 1.
- Min2: Pequenas deduções 2.
- Mod: Deduções moderadas.
- Maj1: Grandes deduções 1.
- Maj2: Grandes deduções 2.
- Sev: Danos severos.
- Sal: Apenas salvamento.
- FireplaceQu: Qualidade da lareira.
- Ex: Excelente (alvenaria excepcional).
- Gd: Boa (alvenaria no andar principal).
- TA: Média (lareira pré-fabricada ou alvenaria no porão).
- Fa: Regular (lareira pré-fabricada no porão).
- Po: Ruim (fogão Ben Franklin).
- NA: Sem lareira.
- Garage Finish: Acabamento interno da garagem.
- Fin: Acabamento completo.
- RFn: Acabamento bruto.
- Unf: Sem acabamento.
- NA: Sem garagem.
- Garage Qual: Qualidade da garagem.
- Ex: Excelente.
- Gd: Boa.
- TA: Média/Comum.
- Fa: Regular.
- Po: Ruim.
- NA: Sem garagem.
- Garage Cond: Condição da garagem.
- Ex: Excelente.
- Gd: Boa.
- TA: Média/Comum.
- Fa: Regular.
- Po: Ruim.
- NA: Sem garagem.
- Paved Drive: Pavimentação da garagem.
- Y: Pavimentada.
- P: Pavimentação parcial.
- N: Terra/Gravilha.
- Pool QC: Qualidade da piscina.
- Ex: Excelente.
- Gd: Boa.
- TA: Média/Comum.
- Fa: Regular.
- NA: Sem piscina.
- Fence: Qualidade da cerca.
- GdPrv: Boa privacidade.
- MnPrv: Mínima privacidade.
- GdWo: Boa de madeira.
- MnWw: Mínima de madeira/arame.
- NA: Sem cerca.
Ajustes no dado¶
# Ajustando tipo da coluna com "MS SubClass"
df['MS SubClass'] = df['MS SubClass'].astype(str)
data = df.drop(columns=['Order', 'PID'])
# Removendo identificadores
features = df.drop(columns=['Order', 'PID', 'SalePrice'])
features.head()
| MS SubClass | MS Zoning | Lot Frontage | Lot Area | Street | Alley | Lot Shape | Land Contour | Utilities | Lot Config | ... | Screen Porch | Pool Area | Pool QC | Fence | Misc Feature | Misc Val | Mo Sold | Yr Sold | Sale Type | Sale Condition | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 20 | RL | 141.0 | 31770 | Pave | NaN | IR1 | Lvl | AllPub | Corner | ... | 0 | 0 | NaN | NaN | NaN | 0 | 5 | 2010 | WD | Normal |
| 1 | 20 | RH | 80.0 | 11622 | Pave | NaN | Reg | Lvl | AllPub | Inside | ... | 120 | 0 | NaN | MnPrv | NaN | 0 | 6 | 2010 | WD | Normal |
| 2 | 20 | RL | 81.0 | 14267 | Pave | NaN | IR1 | Lvl | AllPub | Corner | ... | 0 | 0 | NaN | NaN | Gar2 | 12500 | 6 | 2010 | WD | Normal |
| 3 | 20 | RL | 93.0 | 11160 | Pave | NaN | Reg | Lvl | AllPub | Corner | ... | 0 | 0 | NaN | NaN | NaN | 0 | 4 | 2010 | WD | Normal |
| 4 | 60 | RL | 74.0 | 13830 | Pave | NaN | IR1 | Lvl | AllPub | Inside | ... | 0 | 0 | NaN | MnPrv | NaN | 0 | 3 | 2010 | WD | Normal |
5 rows × 79 columns
target = df['SalePrice']
Distribuição dos valores de venda¶
sns.histplot(target, bins=20, kde=False)
plt.xlabel("Preço de venda")
plt.ylabel("Núm. de imóveis")
plt.title("Distruição do preço de venda")
plt.show()
plt.figure(figsize=(10, 6))
sns.boxplot(x=target)
plt.xlabel("Preço de venda")
plt.title("Distribuição do preço de venda")
plt.show()
Distribuição das variáveis numéricas¶
numerical_data = features.select_dtypes("number")
numerical_data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2930 entries, 0 to 2929 Data columns (total 35 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Lot Frontage 2440 non-null float64 1 Lot Area 2930 non-null int64 2 Overall Qual 2930 non-null int64 3 Overall Cond 2930 non-null int64 4 Year Built 2930 non-null int64 5 Year Remod/Add 2930 non-null int64 6 Mas Vnr Area 2907 non-null float64 7 BsmtFin SF 1 2929 non-null float64 8 BsmtFin SF 2 2929 non-null float64 9 Bsmt Unf SF 2929 non-null float64 10 Total Bsmt SF 2929 non-null float64 11 1st Flr SF 2930 non-null int64 12 2nd Flr SF 2930 non-null int64 13 Low Qual Fin SF 2930 non-null int64 14 Gr Liv Area 2930 non-null int64 15 Bsmt Full Bath 2928 non-null float64 16 Bsmt Half Bath 2928 non-null float64 17 Full Bath 2930 non-null int64 18 Half Bath 2930 non-null int64 19 Bedroom AbvGr 2930 non-null int64 20 Kitchen AbvGr 2930 non-null int64 21 TotRms AbvGrd 2930 non-null int64 22 Fireplaces 2930 non-null int64 23 Garage Yr Blt 2771 non-null float64 24 Garage Cars 2929 non-null float64 25 Garage Area 2929 non-null float64 26 Wood Deck SF 2930 non-null int64 27 Open Porch SF 2930 non-null int64 28 Enclosed Porch 2930 non-null int64 29 3Ssn Porch 2930 non-null int64 30 Screen Porch 2930 non-null int64 31 Pool Area 2930 non-null int64 32 Misc Val 2930 non-null int64 33 Mo Sold 2930 non-null int64 34 Yr Sold 2930 non-null int64 dtypes: float64(11), int64(24) memory usage: 801.3 KB
fig, axes = plt.subplots(nrows=9, ncols=4, figsize=(12, 22))
axes = axes.flatten()
for i in range(len(numerical_data.columns), 36):
axes[i].axis('off')
for i, column in enumerate(numerical_data.columns):
sns.histplot(numerical_data[column], bins=20, kde=False, ax=axes[i])
axes[i].set_xlabel(column)
axes[i].set_title(column)
plt.subplots_adjust(hspace=0.8, wspace=0.8)
plt.show()
Muitas features possuem uma alta contagem de registros com valor 0 ("Pool Area" e "Mas Vnr Area", por exemplo). Isso possivelmente se deve ao fato de imóveis em que esse critério não se aplica. Ou seja, imóveis sem piscina tem área da piscina sendo 0, por exemplo.
Distribuição das variáveis categóricas não numéricas¶
categorical_data = features.select_dtypes(object)
categorical_data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2930 entries, 0 to 2929 Data columns (total 44 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 MS SubClass 2930 non-null object 1 MS Zoning 2930 non-null object 2 Street 2930 non-null object 3 Alley 198 non-null object 4 Lot Shape 2930 non-null object 5 Land Contour 2930 non-null object 6 Utilities 2930 non-null object 7 Lot Config 2930 non-null object 8 Land Slope 2930 non-null object 9 Neighborhood 2930 non-null object 10 Condition 1 2930 non-null object 11 Condition 2 2930 non-null object 12 Bldg Type 2930 non-null object 13 House Style 2930 non-null object 14 Roof Style 2930 non-null object 15 Roof Matl 2930 non-null object 16 Exterior 1st 2930 non-null object 17 Exterior 2nd 2930 non-null object 18 Mas Vnr Type 1155 non-null object 19 Exter Qual 2930 non-null object 20 Exter Cond 2930 non-null object 21 Foundation 2930 non-null object 22 Bsmt Qual 2850 non-null object 23 Bsmt Cond 2850 non-null object 24 Bsmt Exposure 2847 non-null object 25 BsmtFin Type 1 2850 non-null object 26 BsmtFin Type 2 2849 non-null object 27 Heating 2930 non-null object 28 Heating QC 2930 non-null object 29 Central Air 2930 non-null object 30 Electrical 2929 non-null object 31 Kitchen Qual 2930 non-null object 32 Functional 2930 non-null object 33 Fireplace Qu 1508 non-null object 34 Garage Type 2773 non-null object 35 Garage Finish 2771 non-null object 36 Garage Qual 2771 non-null object 37 Garage Cond 2771 non-null object 38 Paved Drive 2930 non-null object 39 Pool QC 13 non-null object 40 Fence 572 non-null object 41 Misc Feature 106 non-null object 42 Sale Type 2930 non-null object 43 Sale Condition 2930 non-null object dtypes: object(44) memory usage: 1007.3+ KB
import seaborn as sns
import matplotlib.pyplot as plt
n_string_features = categorical_data.shape[1]
nrows, ncols = ceil(n_string_features / 4), 4
fig, axs = plt.subplots(ncols=ncols, nrows=nrows, figsize=(14, 80))
axs = axs.ravel()
for feature_name, ax in zip_longest(categorical_data, axs):
if feature_name is None:
ax.axis("off")
continue
sns.countplot(
y=categorical_data[feature_name],
ax=ax,
order=categorical_data[feature_name].value_counts().index
)
ax.set_title(feature_name)
plt.subplots_adjust(hspace=0.4, wspace=0.8)
plt.show()
Correlação entre variáveis numéricas¶
Correlação entre features e valor de venda¶
correlations = data.corr(numeric_only=True)
corr_with_sale_price = correlations[['SalePrice']]
plt.figure(figsize=(7, 8))
sns.heatmap(corr_with_sale_price.sort_values(by='SalePrice', ascending=False), annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title("Correlação das features com valor de venda")
plt.show()
Das variáveis com maior correlação com o preço de venda, a qualidade geral do imóvel (que indica a qualidade do material e acabamento usado e é representado por uma nota de 1 a 10) é a que apresenta a correlação mais alta com o valor de venda.
Em sequência, tem-se o tamanho da área de convivência, a capacidade e área da garagem e a área do sótão com as maiores correlações.
No caso das variáveis com correlação negativa, tem-se que casas com uma área de varanda cercada maior e com mais cozinhas tem uma tendência (leve) a ter um preço menor.
No caso de varandas cercadas, conforme análise abaixo, se vê uma correlação negativa (-0.4) com a idade do imóvel. Ou seja, quanto mais antiga a casa, maior a área de varanda cercada e vice-versa.
Correlação entre as features¶
features_corr = features.corr(numeric_only=True)
sorted_correlations = features_corr.unstack().sort_values(ascending=False)
sorted_correlations = sorted_correlations[sorted_correlations.index.get_level_values(0) < sorted_correlations.index.get_level_values(1)]
top_5_correlations = sorted_correlations.head(5)
print(top_5_correlations)
print('Maiores valores de correlação entre features:')
Garage Area Garage Cars 0.889676 Garage Yr Blt Year Built 0.834849 Gr Liv Area TotRms AbvGrd 0.807772 1st Flr SF Total Bsmt SF 0.800720 Bedroom AbvGr TotRms AbvGrd 0.672647 dtype: float64 Maiores valores de correlação entre features:
bottom_5_correlations = sorted_correlations.tail(5)
print('Menores valores de correlação entre features:')
print(bottom_5_correlations)
Menores valores de correlação entre features: Garage Yr Blt Overall Cond -0.326017 Overall Cond Year Built -0.368773 Enclosed Porch Year Built -0.374364 Bsmt Full Bath Bsmt Unf SF -0.399656 Bsmt Unf SF BsmtFin SF 1 -0.477875 dtype: float64
plt.figure(figsize=(20, 20))
sns.heatmap(features_corr, annot=True, fmt=".1f", cmap="coolwarm")
plt.title("Correlation Heatmap")
plt.show()
Dado a análise acima, é possível notar algumas relações interessantes:
- A qualidade geral ("Overal qual") está fortemente correlacionada com o ano de construção e a capacidade da garagem;
- A área da piscina (que está igual a 0 para quase todos os imóveis) e o mês da venda tem correlação nula com praticamente todas as outras features;
- O tamanho da área de convivência tem correlação bastante alta (> 0.8) com o número de cômodos;
- A área do primeiro piso tem correlação bastante alta (0.8) com a área do porão;
- Forte correlação negativa entre “Bsmt Unf SF” (espaço do porão inacabado) e “BsmtFin SF 1” (espaço do porão acabado), indicando (de forma até óbvia) que à medida que a área do porão acabado aumenta, a área do porão inacabado diminui.
ANOVA¶
Para determinar se variáveis (discretas ou categóricas) influenciam significativamente o preço de venda, é possível utilizar a análise de variância (ANOVA). Essa técnica compara as médias de dois ou mais grupos para identificar se as diferenças entre elas são estatisticamente significativas.
Fatores¶
Na ANOVA, fatores são as variáveis independentes categóricas ou discretas que queremos testar para avaliar se elas afetam a variável dependente (neste caso, o preço de venda). Cada fator pode ter dois ou mais níveis ou valores (categorias).
No dataset da cidade de Ames, por exemplo, podemos ter como fator o bairro (Neighbourhood) e os níveis sendo os bairros em si (Bloomington Heights, Bluestem, Briardale, etc.)
Tipos de ANOVA¶
One-Way ANOVA (ANOVA de um fator):¶
Utilizada quando há apenas um fator (variável independente) com dois ou mais níveis. Exemplo: Comparar o preço de venda entre diferentes tipos de bairros (residencial, comercial, industrial).
Two-Way ANOVA (ANOVA de dois fatores):¶
Utilizada para avaliar dois fatores simultaneamente e investigar interações entre eles. Exemplo: Comparar o preço de venda considerando o tipo de bairro e a qualidade da construção.
Factorial ANOVA (ANOVA de n fatores):¶
Extensão do two-way ANOVA, inclunindo n fatores cada um com 2 ou mais níveis. Exemplo: Comparar o preço de venda considerando o tipo de bairro, a qualidade da construção e o tipo de garagem.
Repeated Measures ANOVA:¶
Usado para para comparar valores para três ou mais grupos relacionados, em que os mesmos indivíduos são medidos várias vezes sob diferentes condições ou pontos de tempo. Esse método é útil na análise de dados em que as observações não são independentes, pois vêm dos mesmos registros repetidamente.
Pressupostos do ANOVA¶
Independência das observações: A observação de determinada amostra não deve influenciar valores de outra amostra, ou seja, o valor de uma observação não deve prover informações sobre outra;
Homogeneidade de variâncias: As variâncias de cada grupo devem ser aproximadamente a mesma. Isso quer dizer que a dispersão dos valores em torno da média de cada grupo deve ser semelhante entre os diferentes grupos.
$\Large{H_0 = \sigma^{2}_{1} = \sigma^{2}_{2} = ... = \sigma^{2}_{n}}$
Normalidade dos dados: Dados de cada grupo devem seguir uma distribuição normal.
Fórmulas¶
Para utilizar o ANOVA, deve-se calcular uma estatística F que é dada pela razão entre a variância intergrupo e intragrupo. Essas suas medidas podem ser obtidas por meio do cálculo da razão entre o o quadrado médio entre os grupos (QME) e o quadrado médio dentro dos grupos (QMD):
$\Large{F = \frac{QME}{QMD}}$
onde:
$\Large{QME = \frac{SQE}{k - 1} = \frac{\sum_{i=1}^k n_i (\bar{X}_i - \bar{X})^2}{k - 1}}$
$\Large{QMD = \frac{SQD}{N - k} = \frac{\sum_{i=1}^k \sum_{j=1}^{n_{i}} ({X}_i - \bar{X})^2}{N - k}}$
sendo:
- $X_{ij}$: Observação j no grupo i.
- $\bar{X_{i}}$: Média do grupo i;
- $\bar{X}$ : Média geral (média de todas as observações).
- $n_j$: Número de observações no grupo i
- N: Número total de observações
- k: Número de grupos
Variáveis escolhidas¶
No caso da análise do preço de vendas, o ANOVA será aplicado nas seguintes variáveis:
- número de vagas na garagem (Garage Cars);
- o ano de construção (Year Built);
- o bairro do imóvel (Neighborhood).
As duas primeiras serão usadas pelo valor alto de correlação com o preço de venda. O bairro será usado pois, em geral, a região do imóvel tem grande impacto no seu preço (incluindo quando dois imóveis possuem as mesmas características).
Seleção e agrupamento dos dados¶
anova_data = data[["Garage Cars", "Neighborhood", "Year Built", "SalePrice"]]
anova_data
| Garage Cars | Neighborhood | Year Built | SalePrice | |
|---|---|---|---|---|
| 0 | 2.0 | NAmes | 1960 | 215000 |
| 1 | 1.0 | NAmes | 1961 | 105000 |
| 2 | 1.0 | NAmes | 1958 | 172000 |
| 3 | 2.0 | NAmes | 1968 | 244000 |
| 4 | 2.0 | Gilbert | 1997 | 189900 |
| ... | ... | ... | ... | ... |
| 2925 | 2.0 | Mitchel | 1984 | 142500 |
| 2926 | 2.0 | Mitchel | 1983 | 131000 |
| 2927 | 0.0 | Mitchel | 1992 | 132000 |
| 2928 | 2.0 | Mitchel | 1974 | 170000 |
| 2929 | 3.0 | Mitchel | 1993 | 188000 |
2930 rows × 4 columns
print('Números de vagas existentes:', anova_data['Garage Cars'].unique())
Números de vagas existentes: [ 2. 1. 3. 0. 4. 5. nan]
print('Anos de construção existentes:', anova_data['Year Built'].unique())
Anos de construção existentes: [1960 1961 1958 1968 1997 1998 2001 1992 1995 1999 1993 1990 1985 2003 1988 2010 1951 1978 1977 1974 2000 1970 1971 1975 2009 2007 2005 2004 2002 2006 1996 1994 2008 1980 1979 1984 1920 1965 1967 1963 1962 1976 1972 1966 1959 1964 1950 1952 1949 1940 1954 1955 1957 1956 1953 1948 1900 1910 1927 1915 1945 1929 1938 1923 1928 1890 1885 1922 1925 1939 1942 1936 1930 1921 1912 1917 1907 1875 1969 1947 1946 1987 1941 1924 1914 1931 1919 1989 1896 1973 1991 1981 1986 1916 1926 1935 1892 1898 1880 1882 1937 1902 1934 1982 1983 1932 1918 1904 1905 1872 1893 1906 1908 1911 1895 1879 1901 1913]
print('Bairros existentes:', anova_data['Neighborhood'].unique())
Bairros existentes: ['NAmes' 'Gilbert' 'StoneBr' 'NWAmes' 'Somerst' 'BrDale' 'NPkVill' 'NridgHt' 'Blmngtn' 'NoRidge' 'SawyerW' 'Sawyer' 'Greens' 'BrkSide' 'OldTown' 'IDOTRR' 'ClearCr' 'SWISU' 'Edwards' 'CollgCr' 'Crawfor' 'Blueste' 'Mitchel' 'Timber' 'MeadowV' 'Veenker' 'GrnHill' 'Landmrk']
# Substituir valor faltante por 0
anova_data.loc[anova_data['Garage Cars'].isna(), 'Garage Cars'] = anova_data['Garage Cars'].fillna(0)
anova_data[anova_data['Garage Cars'].isna()]
| Garage Cars | Neighborhood | Year Built | SalePrice |
|---|
Visualização das distribuições por nível de cada grupo¶
Número de vagas¶
plt.figure(figsize=(12, 8))
for num in sorted(anova_data['Garage Cars'].dropna().unique()):
sns.kdeplot(
data=anova_data[anova_data['Garage Cars'] == num]['SalePrice'],
label=f'{int(num)} vagas',
fill=True,
warn_singular=False,
alpha=0.5
)
plt.title('Distribuição do valor de venda por núm. de vagas')
plt.xlabel('Valor de venda ($)')
plt.ylabel('Densidade')
plt.legend(title='Núm. de vagas')
plt.show()
plt.figure(figsize=(12, 8))
sns.boxplot(
data=anova_data,
x='Garage Cars',
y='SalePrice',
palette='Set2',
hue='Garage Cars',
)
# Add title and labels
plt.title('Distribuição do valor de venda por número de vagas')
plt.xlabel('Número de vagas na garagem')
plt.ylabel('Valor de venda ($)')
plt.show()
Ano de construção¶
plt.figure(figsize=(12, 8))
for num in sorted(anova_data['Year Built'].dropna().unique()):
sns.kdeplot(
data=anova_data[anova_data['Year Built'] == num]['SalePrice'],
label=f'{int(num)}',
fill=True,
warn_singular=False,
alpha=0.5
)
plt.title('Distribuição do valor de venda por ano de construção')
plt.xlabel('Valor de venda ($)')
plt.ylabel('Densidade')
plt.show()
plt.figure(figsize=(12, 20))
box_plot_data = anova_data.copy()
box_plot_data.loc[:,'Year Built'] = box_plot_data['Year Built'].astype(int).astype(str)
sns.boxplot(
data=box_plot_data.sort_values(by='Year Built'),
x='SalePrice',
y='Year Built',
palette='Set2',
hue='Year Built',
)
plt.title('Distribuição do valor de venda por ano de construção')
plt.ylabel('Ano de construção')
plt.xlabel('Valor de venda ($)')
plt.show()
/tmp/ipykernel_16041/50697369.py:4: FutureWarning: Setting an item of incompatible dtype is deprecated and will raise in a future error of pandas. Value '['1960' '1961' '1958' ... '1992' '1974' '1993']' has dtype incompatible with int64, please explicitly cast to a compatible dtype first. box_plot_data.loc[:,'Year Built'] = box_plot_data['Year Built'].astype(int).astype(str)
Bairro¶
plt.figure(figsize=(12, 8))
for b in sorted(anova_data['Neighborhood'].dropna().unique()):
sns.kdeplot(
data=anova_data[anova_data['Neighborhood'] == b]['SalePrice'],
label=f'{b}',
fill=True,
warn_singular=False,
alpha=0.5
)
plt.title('Distribuição do valor de venda por bairro')
plt.xlabel('Valor de venda ($)')
plt.ylabel('Densidade')
plt.legend(title='Bairro')
plt.show()
plt.figure(figsize=(12, 20))
box_plot_data = anova_data.copy()
box_plot_data.loc[:,'Year Built'] = box_plot_data['Year Built'].astype(int).astype(str)
sns.boxplot(
data=box_plot_data.sort_values(by='Neighborhood'),
x='SalePrice',
y='Neighborhood',
palette='Set2',
hue='Neighborhood',
)
plt.title('Distribuição do valor de venda por bairro')
plt.ylabel('Bairro')
plt.xlabel('Valor de venda ($)')
plt.show()
/tmp/ipykernel_16041/3709031947.py:4: FutureWarning: Setting an item of incompatible dtype is deprecated and will raise in a future error of pandas. Value '['1960' '1961' '1958' ... '1992' '1974' '1993']' has dtype incompatible with int64, please explicitly cast to a compatible dtype first. box_plot_data.loc[:,'Year Built'] = box_plot_data['Year Built'].astype(int).astype(str)
Checagem dos pressupostos¶
Verificação da Normalidade¶
Para verificar que os dados de cada grupo seguem uma distribuição normal, dois testes serão usados:
- Gŕafico Q-Q: ferramenta visual usada para comparar a distribuição dos dados com a distribuição normal. Se os pontos no gráfico Q-Q seguirem uma linha reta (diagonal), isso sugere que os dados seguem uma distribuição normal.
- Teste de Shapiro-Wilk: teste estatístico utilizado para avaliar a normalidade dos dados. A hipótese nula do teste é que os dados seguem uma distribuição normal. Se o p-valor do teste for superior a um determinado nível de significância (geralmente 0.05), não se pode rejeitar a hipótese nula, ou seja, os dados podem ser considerados normalmente distribuídos.
Q-Q Plot - Número de vagas¶
sns.set_theme(style="whitegrid", palette='Set2')
# Unique garage car counts
num_garage_cars = anova_data['Garage Cars'].dropna().unique()
num_garage_cars.sort()
# Define the number of columns and rows for the subplots
ncols = 4
nrows = (len(num_garage_cars) + ncols - 1) // ncols
# Create subplots
fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(16, 6 * nrows))
axes = axes.flatten()
# Generate Q-Q plots for each group
for i, num in enumerate(num_garage_cars):
group = anova_data[anova_data['Garage Cars'] == num]['SalePrice'].dropna()
ax = axes[i]
stats.probplot(group, dist="norm", plot=ax)
ax.set_title(f"Q-Q Plot - Número de vagas = {int(num)}")
ax.grid(True) # Ensure grid lines for consistency with Seaborn theme
# Turn off unused axes
for j in range(len(num_garage_cars), len(axes)):
axes[j].axis('off')
plt.tight_layout()
plt.show()
/home/joaorobson/Documentos/mestrado/analise/env/lib/python3.9/site-packages/scipy/stats/_stats_mstats_common.py:182: RuntimeWarning: invalid value encountered in scalar divide slope = ssxym / ssxm /home/joaorobson/Documentos/mestrado/analise/env/lib/python3.9/site-packages/scipy/stats/_stats_mstats_common.py:196: RuntimeWarning: invalid value encountered in sqrt t = r * np.sqrt(df / ((1.0 - r + TINY)*(1.0 + r + TINY))) /home/joaorobson/Documentos/mestrado/analise/env/lib/python3.9/site-packages/scipy/stats/_stats_mstats_common.py:199: RuntimeWarning: invalid value encountered in scalar divide slope_stderr = np.sqrt((1 - r**2) * ssym / ssxm / df)
Teste de Shapiro-Wilk - Número de vagas¶
for i, num in enumerate(num_garage_cars):
group = anova_data[anova_data['Garage Cars'] == num]['SalePrice']
if len(group) >= 3:
stat, p_value = stats.shapiro(group)
print(f"Teste de normalidade para o grupo com número de vagas = {int(num)}: p-valor = {p_value}")
if p_value > 0.05:
print(f'O grupo com número de vagas = {int(num)} é normalmente distribuído\n\n')
else:
print(f'O grupo com número de vagas = {int(num)} não é normalmente distribuído\n\n')
Teste de normalidade para o grupo com número de vagas = 0: p-valor = 0.00034696148654941004 O grupo com número de vagas = 0 não é normalmente distribuído Teste de normalidade para o grupo com número de vagas = 1: p-valor = 1.9470318103072302e-17 O grupo com número de vagas = 1 não é normalmente distribuído Teste de normalidade para o grupo com número de vagas = 2: p-valor = 1.286892160237674e-20 O grupo com número de vagas = 2 não é normalmente distribuído Teste de normalidade para o grupo com número de vagas = 3: p-valor = 8.073764006444037e-09 O grupo com número de vagas = 3 não é normalmente distribuído Teste de normalidade para o grupo com número de vagas = 4: p-valor = 0.03041080136929493 O grupo com número de vagas = 4 não é normalmente distribuído
Q-Q Plot - Ano de construção¶
num_years = anova_data['Year Built'].unique()
num_years.sort()
num_years
array([1872, 1875, 1879, 1880, 1882, 1885, 1890, 1892, 1893, 1895, 1896,
1898, 1900, 1901, 1902, 1904, 1905, 1906, 1907, 1908, 1910, 1911,
1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922,
1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1934,
1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1945, 1946, 1947,
1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958,
1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969,
1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980,
1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991,
1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010])
ncols = 4
nrows = (len(num_years) + ncols - 1) // ncols
fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(16, 6 * nrows))
axes = axes.flatten()
for i, num in enumerate(num_years):
group = anova_data[anova_data['Year Built'] == num]['SalePrice']
ax = axes[i]
stats.probplot(group, dist="norm", plot=ax)
ax.set_title(f"Q-Q Plot - Ano de construção = {num}")
for j in range(len(num_years), len(axes)):
axes[j].axis('off') # Turn off unused axes
plt.tight_layout()
plt.show()
Teste de Shapiro-Wilk - Ano de construção¶
for i, year in enumerate(num_years):
group = anova_data[anova_data['Year Built'] == year]['SalePrice']
if len(group) >= 3:
stat, p_value = stats.shapiro(group)
message = 'Não é normalmente distribuído' if p_value < 0.05 else 'É normalmente distribuído'
print(f'Teste para {year}: p-value: {p_value} ===> {message}')
Teste para 1880: p-value: 0.05174518831993148 ===> É normalmente distribuído Teste para 1890: p-value: 0.8853055849632341 ===> É normalmente distribuído Teste para 1895: p-value: 0.9588902970127895 ===> É normalmente distribuído Teste para 1900: p-value: 0.500543209443652 ===> É normalmente distribuído Teste para 1905: p-value: 0.981650737529981 ===> É normalmente distribuído Teste para 1910: p-value: 0.9648752044622204 ===> É normalmente distribuído Teste para 1912: p-value: 0.9902272074150945 ===> É normalmente distribuído Teste para 1914: p-value: 0.5586978661006639 ===> É normalmente distribuído Teste para 1915: p-value: 0.27673315035952606 ===> É normalmente distribuído Teste para 1916: p-value: 0.693442115838624 ===> É normalmente distribuído Teste para 1917: p-value: 0.9498906927274425 ===> É normalmente distribuído Teste para 1918: p-value: 0.6281212187424267 ===> É normalmente distribuído Teste para 1919: p-value: 0.2187003716373826 ===> É normalmente distribuído Teste para 1920: p-value: 0.007756040239089949 ===> Não é normalmente distribuído Teste para 1921: p-value: 0.7662728902773073 ===> É normalmente distribuído Teste para 1922: p-value: 0.4698319478478933 ===> É normalmente distribuído Teste para 1923: p-value: 0.7705937820971467 ===> É normalmente distribuído Teste para 1924: p-value: 0.00029867666893049503 ===> Não é normalmente distribuído Teste para 1925: p-value: 0.016835371008837738 ===> Não é normalmente distribuído Teste para 1926: p-value: 0.01350897927335256 ===> Não é normalmente distribuído Teste para 1927: p-value: 0.2545317767358356 ===> É normalmente distribuído Teste para 1928: p-value: 0.745414626522661 ===> É normalmente distribuído Teste para 1929: p-value: 0.15816573675223444 ===> É normalmente distribuído Teste para 1930: p-value: 0.48015181172109217 ===> É normalmente distribuído Teste para 1931: p-value: 0.9652939812865917 ===> É normalmente distribuído Teste para 1932: p-value: 0.8214133494281288 ===> É normalmente distribuído Teste para 1934: p-value: 0.3199395646249497 ===> É normalmente distribuído Teste para 1935: p-value: 0.08947005846607171 ===> É normalmente distribuído Teste para 1936: p-value: 0.28972757413374495 ===> É normalmente distribuído Teste para 1937: p-value: 0.8105309296502605 ===> É normalmente distribuído Teste para 1938: p-value: 0.95161515700322 ===> É normalmente distribuído Teste para 1939: p-value: 4.5532911370514555e-05 ===> Não é normalmente distribuído Teste para 1940: p-value: 0.24627116313097946 ===> É normalmente distribuído Teste para 1941: p-value: 0.013995783544601048 ===> Não é normalmente distribuído Teste para 1942: p-value: 0.7134198112678712 ===> É normalmente distribuído Teste para 1945: p-value: 0.00179770878285282 ===> Não é normalmente distribuído Teste para 1946: p-value: 0.9539955075500954 ===> É normalmente distribuído Teste para 1947: p-value: 0.7409020371733634 ===> É normalmente distribuído Teste para 1948: p-value: 0.03422831727674282 ===> Não é normalmente distribuído Teste para 1949: p-value: 0.22272668407825813 ===> É normalmente distribuído Teste para 1950: p-value: 1.7937993345775662e-05 ===> Não é normalmente distribuído Teste para 1951: p-value: 0.28954591235419513 ===> É normalmente distribuído Teste para 1952: p-value: 0.046200164435247715 ===> Não é normalmente distribuído Teste para 1953: p-value: 0.019299587002949446 ===> Não é normalmente distribuído Teste para 1954: p-value: 2.8360338289812952e-06 ===> Não é normalmente distribuído Teste para 1955: p-value: 0.41346458699185634 ===> É normalmente distribuído Teste para 1956: p-value: 0.0013199182470386697 ===> Não é normalmente distribuído Teste para 1957: p-value: 0.0019163917280157203 ===> Não é normalmente distribuído Teste para 1958: p-value: 6.531884707189764e-05 ===> Não é normalmente distribuído Teste para 1959: p-value: 8.912408048204749e-07 ===> Não é normalmente distribuído Teste para 1960: p-value: 0.0008696475268495962 ===> Não é normalmente distribuído Teste para 1961: p-value: 0.6614503952734045 ===> É normalmente distribuído Teste para 1962: p-value: 0.0005654059872138246 ===> Não é normalmente distribuído Teste para 1963: p-value: 0.03790500104655876 ===> Não é normalmente distribuído Teste para 1964: p-value: 0.31483782475198985 ===> É normalmente distribuído Teste para 1965: p-value: 5.470797814437687e-06 ===> Não é normalmente distribuído Teste para 1966: p-value: 0.004415509812593536 ===> Não é normalmente distribuído Teste para 1967: p-value: 0.00021736606713689335 ===> Não é normalmente distribuído Teste para 1968: p-value: 7.627243622480127e-05 ===> Não é normalmente distribuído Teste para 1969: p-value: 0.8387897790691854 ===> É normalmente distribuído Teste para 1970: p-value: 0.00036989506244146744 ===> Não é normalmente distribuído Teste para 1971: p-value: 1.1021009331748361e-05 ===> Não é normalmente distribuído Teste para 1972: p-value: 7.742263976948137e-07 ===> Não é normalmente distribuído Teste para 1973: p-value: 0.0059394720713218194 ===> Não é normalmente distribuído Teste para 1974: p-value: 0.00275110579439024 ===> Não é normalmente distribuído Teste para 1975: p-value: 0.0006797612744222474 ===> Não é normalmente distribuído Teste para 1976: p-value: 6.81857849710805e-05 ===> Não é normalmente distribuído Teste para 1977: p-value: 0.00028330307529213835 ===> Não é normalmente distribuído Teste para 1978: p-value: 0.0006648802020903572 ===> Não é normalmente distribuído Teste para 1979: p-value: 0.12117694347216429 ===> É normalmente distribuído Teste para 1980: p-value: 0.017527259320090458 ===> Não é normalmente distribuído Teste para 1981: p-value: 0.05583720817054449 ===> É normalmente distribuído Teste para 1982: p-value: 0.5775285480071335 ===> É normalmente distribuído Teste para 1983: p-value: 0.0005313685626627969 ===> Não é normalmente distribuído Teste para 1984: p-value: 0.28315853405856106 ===> É normalmente distribuído Teste para 1985: p-value: 0.5866564199299062 ===> É normalmente distribuído Teste para 1986: p-value: 0.11508251579681528 ===> É normalmente distribuído Teste para 1987: p-value: 0.7392869763015086 ===> É normalmente distribuído Teste para 1988: p-value: 0.4341987219068721 ===> É normalmente distribuído Teste para 1989: p-value: 0.36995662503019017 ===> É normalmente distribuído Teste para 1990: p-value: 0.1323811772608981 ===> É normalmente distribuído Teste para 1991: p-value: 0.8427975599375863 ===> É normalmente distribuído Teste para 1992: p-value: 0.0016074925102133781 ===> Não é normalmente distribuído Teste para 1993: p-value: 1.315938763026999e-05 ===> Não é normalmente distribuído Teste para 1994: p-value: 3.6527127392534665e-07 ===> Não é normalmente distribuído Teste para 1995: p-value: 4.76108673950351e-05 ===> Não é normalmente distribuído Teste para 1996: p-value: 7.169422824854453e-08 ===> Não é normalmente distribuído Teste para 1997: p-value: 5.409537352241832e-06 ===> Não é normalmente distribuído Teste para 1998: p-value: 0.0021716727995445993 ===> Não é normalmente distribuído Teste para 1999: p-value: 4.080746106189122e-06 ===> Não é normalmente distribuído Teste para 2000: p-value: 0.0008811630258841331 ===> Não é normalmente distribuído Teste para 2001: p-value: 1.473378564746756e-05 ===> Não é normalmente distribuído Teste para 2002: p-value: 0.13759242451128417 ===> É normalmente distribuído Teste para 2003: p-value: 1.3755841308534664e-08 ===> Não é normalmente distribuído Teste para 2004: p-value: 7.585474653950892e-08 ===> Não é normalmente distribuído Teste para 2005: p-value: 4.011519543591952e-09 ===> Não é normalmente distribuído Teste para 2006: p-value: 1.5643072737677566e-07 ===> Não é normalmente distribuído Teste para 2007: p-value: 3.1626361018174618e-06 ===> Não é normalmente distribuído Teste para 2008: p-value: 0.03502653379491699 ===> Não é normalmente distribuído Teste para 2009: p-value: 0.0014252358000531608 ===> Não é normalmente distribuído Teste para 2010: p-value: 0.7588906771734721 ===> É normalmente distribuído
Q-Q Plot - Bairro¶
anova_data['Neighborhood'].value_counts()
Neighborhood NAmes 443 CollgCr 267 OldTown 239 Edwards 194 Somerst 182 NridgHt 166 Gilbert 165 Sawyer 151 NWAmes 131 SawyerW 125 Mitchel 114 BrkSide 108 Crawfor 103 IDOTRR 93 Timber 72 NoRidge 71 StoneBr 51 SWISU 48 ClearCr 44 MeadowV 37 BrDale 30 Blmngtn 28 Veenker 24 NPkVill 23 Blueste 10 Greens 8 GrnHill 2 Landmrk 1 Name: count, dtype: int64
neighborhoods = anova_data['Neighborhood'].unique()
neighborhoods.sort()
ncols = 4
nrows = (len(neighborhoods) + ncols - 1) // ncols
fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(16, 6 * nrows))
axes = axes.flatten()
for i, n in enumerate(neighborhoods):
group = anova_data[anova_data['Neighborhood'] == n]['SalePrice']
ax = axes[i]
stats.probplot(group, dist="norm", plot=ax)
ax.set_title(f"Q-Q Plot - Bairro = {num}")
for j in range(len(neighborhoods), len(axes)):
axes[j].axis('off') # Turn off unused axes
plt.tight_layout()
plt.show()
/home/joaorobson/Documentos/mestrado/analise/env/lib/python3.9/site-packages/scipy/stats/_stats_mstats_common.py:182: RuntimeWarning: invalid value encountered in scalar divide slope = ssxym / ssxm /home/joaorobson/Documentos/mestrado/analise/env/lib/python3.9/site-packages/scipy/stats/_stats_mstats_common.py:196: RuntimeWarning: invalid value encountered in sqrt t = r * np.sqrt(df / ((1.0 - r + TINY)*(1.0 + r + TINY))) /home/joaorobson/Documentos/mestrado/analise/env/lib/python3.9/site-packages/scipy/stats/_stats_mstats_common.py:199: RuntimeWarning: invalid value encountered in scalar divide slope_stderr = np.sqrt((1 - r**2) * ssym / ssxm / df)
Teste de Shapiro-Wilk - Bairro¶
for i, n in enumerate(neighborhoods):
group = anova_data[anova_data['Neighborhood'] == n]['SalePrice']
if len(group) >= 3:
stat, p_value = stats.shapiro(group)
message = 'Não é normalmente distribuído' if p_value < 0.05 else 'É normalmente distribuído'
print(f'Teste para {n}: p-value: {p_value} ===> {message}')
Teste para Blmngtn: p-value: 0.11663211634290238 ===> É normalmente distribuído Teste para Blueste: p-value: 0.08252896441393633 ===> É normalmente distribuído Teste para BrDale: p-value: 0.38928243641038257 ===> É normalmente distribuído Teste para BrkSide: p-value: 0.006494447524226965 ===> Não é normalmente distribuído Teste para ClearCr: p-value: 0.5537581517455117 ===> É normalmente distribuído Teste para CollgCr: p-value: 4.162976796933535e-10 ===> Não é normalmente distribuído Teste para Crawfor: p-value: 0.0003848630455699623 ===> Não é normalmente distribuído Teste para Edwards: p-value: 1.7031499072047162e-13 ===> Não é normalmente distribuído Teste para Gilbert: p-value: 1.0349366202152243e-13 ===> Não é normalmente distribuído Teste para Greens: p-value: 0.1826224861521602 ===> É normalmente distribuído Teste para IDOTRR: p-value: 0.6134871224485963 ===> É normalmente distribuído Teste para MeadowV: p-value: 0.0012603169015310627 ===> Não é normalmente distribuído Teste para Mitchel: p-value: 1.5693742119633185e-05 ===> Não é normalmente distribuído Teste para NAmes: p-value: 5.124904026764063e-17 ===> Não é normalmente distribuído Teste para NPkVill: p-value: 0.02359295127537279 ===> Não é normalmente distribuído Teste para NWAmes: p-value: 0.00018350963346339577 ===> Não é normalmente distribuído Teste para NoRidge: p-value: 3.573071909738691e-10 ===> Não é normalmente distribuído Teste para NridgHt: p-value: 0.0001925743600092388 ===> Não é normalmente distribuído Teste para OldTown: p-value: 8.350162529383747e-17 ===> Não é normalmente distribuído Teste para SWISU: p-value: 0.9674667047194345 ===> É normalmente distribuído Teste para Sawyer: p-value: 0.010789889764137034 ===> Não é normalmente distribuído Teste para SawyerW: p-value: 0.07068888302563255 ===> É normalmente distribuído Teste para Somerst: p-value: 5.917669800924551e-07 ===> Não é normalmente distribuído Teste para StoneBr: p-value: 0.0291788694489528 ===> Não é normalmente distribuído Teste para Timber: p-value: 0.001428607915934424 ===> Não é normalmente distribuído Teste para Veenker: p-value: 0.41105359442157713 ===> É normalmente distribuído
Verificação de homocedasticidade¶
A homocedasticidade é um pressuposto importante na ANOVA que afirma que as variâncias de cada grupo devem ser aproximadamente iguais. Ou seja, a variabilidade dos dados dentro de cada grupo não pode ser significativamente diferente de um grupo para outro. Esse pressuposto é crucial porque a ANOVA assume que a dispersão das observações em torno da média é consistente em todos os grupos, o que afeta a precisão dos testes e a validade dos resultados.
Quando esse pressuposto é violado, ou seja, quando há heterocedasticidade (variâncias desiguais), os resultados da ANOVA podem ser distorcidos, levando a conclusões erradas sobre a significância estatística.
Para verificar se os grupos seguem esse pressuposto, podemos aplicar o teste de Levene, que se baseia nas seguintes hipóteses:
- H0 (hipótese nula): As variâncias dos grupos são iguais (homocedasticidade).
- H1 (hipótese alternativa): Pelo menos uma variância é diferente (heterocedasticidade).
Teste de Levene - Número de vagas¶
stat, p_value = stats.levene(*[anova_data[anova_data['Garage Cars'] == group]['SalePrice'] for group in num_garage_cars])
print(f"Teste de homocedasticidade (Levene): p-valor = {p_value}")
if p_value > 0.05:
print("As variâncias são homogêneas (homocedasticidade confirmada)")
else:
print("As variâncias não são homogêneas (homocedasticidade violada)")
Teste de homocedasticidade (Levene): p-valor = 3.3836735407082798e-102 As variâncias não são homogêneas (homocedasticidade violada)
Teste de Levene - Ano de construção¶
stat, p_value = stats.levene(*[anova_data[anova_data['Year Built'] == group]['SalePrice'] for group in num_years])
print(f"Teste de homocedasticidade (Levene): p-valor = {p_value}")
if p_value > 0.05:
print("As variâncias são homogêneas (homocedasticidade confirmada)")
else:
print("As variâncias não são homogêneas (homocedasticidade violada)")
Teste de homocedasticidade (Levene): p-valor = 5.840898592962907e-45 As variâncias não são homogêneas (homocedasticidade violada)
Teste de Levene - Bairro¶
stat, p_value = stats.levene(*[anova_data[anova_data['Neighborhood'] == group]['SalePrice'] for group in neighborhoods])
print(f"Teste de homocedasticidade (Levene): p-valor = {p_value}")
if p_value > 0.05:
print("As variâncias são homogêneas (homocedasticidade confirmada)")
else:
print("As variâncias não são homogêneas (homocedasticidade violada)")
Teste de homocedasticidade (Levene): p-valor = 2.915202579905449e-112 As variâncias não são homogêneas (homocedasticidade violada)
Verificação da Independência dos Erros¶
A independência dos erros é um pressuposto importante na análise de variância (ANOVA). Ele significa que os erros (resíduos) de uma observação não devem influenciar os erros de outra observação. Em outras palavras, os erros de uma amostra não podem ser correlacionados entre si. Se esse pressuposto for violado, os resultados da ANOVA podem não ser válidos, o que pode afetar a confiança nas conclusões da análise.
model = smf.ols("SalePrice ~ Q('Garage Cars')", data=anova_data).fit()
residuals = model.resid
sns.set_theme(style="whitegrid", palette="Set2")
fig, ax = plt.subplots(figsize=(8, 6))
stats.probplot(residuals, dist="norm", plot=ax)
plt.title('Q-Q Plot - Resíduos - Núm. de vagas')
plt.show()
model = smf.ols("SalePrice ~ Q('Year Built')", data=anova_data).fit()
residuals = model.resid
plt.figure(figsize=(8, 6))
stats.probplot(residuals, dist="norm", plot=plt)
plt.title('Q-Q Plot - Resíduos - Ano de construção')
plt.show()
model = smf.ols("SalePrice ~ Q('Neighborhood')", data=anova_data).fit()
residuals = model.resid
plt.figure(figsize=(8, 6))
stats.probplot(residuals, dist="norm", plot=plt)
plt.title('Q-Q Plot - Resíduos - Bairro')
plt.show()
Como mostrado nas análises acima, muitos níveis nos grupos não seguem os pressupostos (normalizade e homoscedasticidade, principalmente). Dessa forma, um teste não-paramétrico (Kruskal-Wallis) será abordado abaixo.
Esse teste permite comparar três ou mais grupos independentes que não seguem uma distribuição normal. Nesse sentido, ele se baseia nas seguintes hipóteses:
- H0: as medianas de todos os grupos são iguais;
- H1: pelo menos uma mediana é diferente.
Teste não-paramétrico (Kruskal-Wallis)¶
Número de vagas¶
from scipy.stats import kruskal
stat, p = kruskal(*[anova_data[anova_data['Garage Cars'] == num]['SalePrice'] for num in num_garage_cars])
print('Estatítistica= %.3f, p=%.3f' % (stat, p))
alpha = 0.05
if p > alpha:
print('Os grupos têm a mesma distribuição de preços de venda. (Não rejeita H0)')
else:
print('Pelo menos um dos grupos possui uma distribuição diferente de preços de venda (rejeita H0)')
Estatítistica= 1459.143, p=0.000 Pelo menos um dos grupos possui uma distribuição diferente de preços de venda (rejeita H0)
Ano de construção¶
from scipy.stats import kruskal
stat, p = kruskal(*[anova_data[anova_data['Year Built'] == num]['SalePrice'] for num in num_years])
print('Estatítistica= %.3f, p=%.3f' % (stat, p))
alpha = 0.05
if p > alpha:
print('Os grupos têm a mesma distribuição de preços de venda. (Não rejeita H0)')
else:
print('Pelo menos um dos grupos possui uma distribuição diferente de preços de venda (rejeita H0)')
Estatítistica= 1623.970, p=0.000 Pelo menos um dos grupos possui uma distribuição diferente de preços de venda (rejeita H0)
Bairro¶
from scipy.stats import kruskal
stat, p = kruskal(*[anova_data[anova_data['Neighborhood'] == num]['SalePrice'] for num in neighborhoods])
print('Estatítistica= %.3f, p=%.3f' % (stat, p))
alpha = 0.05
if p > alpha:
print('Os grupos têm a mesma distribuição de preços de venda. (Não rejeita H0)')
else:
print('Pelo menos um dos grupos possui uma distribuição diferente de preços de venda (rejeita H0)')
Estatítistica= 1798.767, p=0.000 Pelo menos um dos grupos possui uma distribuição diferente de preços de venda (rejeita H0)
Teste pós-hoc¶
Para determinar quais grupos específicos diferem entre si, podemos utilizar um teste pós-hoc.
O teste de Dunn geralmente é utilizado quando os resultados do teste de Kruskal-Wallis são estatisticamente relevantes. Ele funciona retornando um p-valor (no caso abaixo, ajustado conforme o método de Bonferroni, que múltiplica o valor original de p pelo número de comparações feitas).
Nesse contexto, as hipóteses são:
- H₀: As distribuições das duas populações são iguais.
- H₁: As distribuições das duas populações são diferentes.
Se tivermos um valor de p para determinada comparação entre um grupo i e um grupo j menor que um nível de significância (aqui, 0.05), tem-se a rejeição da hipótese nula, ou seja, um indicativo de que os grupos são significativamente diferentes.
Número de vagas¶
dunn_results = sp.posthoc_dunn(anova_data, val_col='SalePrice', group_col='Garage Cars', p_adjust='bonferroni')
dunn_results
| 0.0 | 1.0 | 2.0 | 3.0 | 4.0 | 5.0 | |
|---|---|---|---|---|---|---|
| 0.0 | 1.000000e+00 | 7.739695e-04 | 6.369549e-64 | 3.363260e-146 | 8.746749e-12 | 1.000000 |
| 1.0 | 7.739695e-04 | 1.000000e+00 | 1.197350e-130 | 5.345619e-243 | 1.746484e-08 | 1.000000 |
| 2.0 | 6.369549e-64 | 1.197350e-130 | 1.000000e+00 | 4.481351e-71 | 9.263433e-01 | 1.000000 |
| 3.0 | 3.363260e-146 | 5.345619e-243 | 4.481351e-71 | 1.000000e+00 | 4.116657e-01 | 0.396828 |
| 4.0 | 8.746749e-12 | 1.746484e-08 | 9.263433e-01 | 4.116657e-01 | 1.000000e+00 | 1.000000 |
| 5.0 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 3.968276e-01 | 1.000000e+00 | 1.000000 |
print('Distribuições significativamente diferentes (Núm. de vagas):')
mask = (dunn_results < 0.05) & (dunn_results != 1)
for i in range(len(dunn_results)):
for j in range(i):
if mask.iloc[i, j]:
print(f'{dunn_results.index[i]} vs {dunn_results.index[j]}, p-valor: {dunn_results.iloc[i, j]:.6f}')
Distribuições significativamente diferentes (Núm. de vagas): 1.0 vs 0.0, p-valor: 0.000774 2.0 vs 0.0, p-valor: 0.000000 2.0 vs 1.0, p-valor: 0.000000 3.0 vs 0.0, p-valor: 0.000000 3.0 vs 1.0, p-valor: 0.000000 3.0 vs 2.0, p-valor: 0.000000 4.0 vs 0.0, p-valor: 0.000000 4.0 vs 1.0, p-valor: 0.000000
Ano de construção¶
dunn_results = sp.posthoc_dunn(anova_data, val_col='SalePrice', group_col='Year Built', p_adjust='bonferroni')
dunn_results
| 1872 | 1875 | 1879 | 1880 | 1882 | 1885 | 1890 | 1892 | 1893 | 1895 | ... | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1872 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1875 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1879 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1880 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1882 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2006 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2007 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 0.817712 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2008 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 0.098999 | 1.0 | 1.0 | 0.831283 | ... | 1.0 | 1.0 | 1.0 | 0.71786 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2009 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2010 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
118 rows × 118 columns
dunn_results
| 1872 | 1875 | 1879 | 1880 | 1882 | 1885 | 1890 | 1892 | 1893 | 1895 | ... | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1872 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1875 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1879 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1880 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1882 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2006 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2007 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 0.817712 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2008 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 0.098999 | 1.0 | 1.0 | 0.831283 | ... | 1.0 | 1.0 | 1.0 | 0.71786 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2009 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2010 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.000000 | 1.0 | 1.0 | 1.000000 | ... | 1.0 | 1.0 | 1.0 | 1.00000 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
118 rows × 118 columns
print('Distribuições significativamente diferentes (Ano de construção):')
mask = (dunn_results < 0.05) & (dunn_results != 1)
years_diff = np.array([])
for i in range(len(dunn_results)):
for j in range(i):
if mask.iloc[i, j]:
print(f'{dunn_results.index[i]} vs {dunn_results.index[j]}, p-valor: {dunn_results.iloc[i, j]:.6f}')
years_diff = np.append(years_diff, abs(int(dunn_results.index[i] - dunn_results.index[j])))
Distribuições significativamente diferentes (Ano de construção): 1974 vs 1910, p-valor: 0.019001 1974 vs 1920, p-valor: 0.007027 1976 vs 1910, p-valor: 0.032564 1976 vs 1920, p-valor: 0.006390 1977 vs 1910, p-valor: 0.000698 1977 vs 1920, p-valor: 0.000073 1978 vs 1910, p-valor: 0.000349 1978 vs 1920, p-valor: 0.000047 1980 vs 1920, p-valor: 0.029074 1981 vs 1900, p-valor: 0.003415 1981 vs 1910, p-valor: 0.000176 1981 vs 1920, p-valor: 0.000086 1981 vs 1922, p-valor: 0.010933 1981 vs 1924, p-valor: 0.003072 1981 vs 1925, p-valor: 0.008248 1981 vs 1930, p-valor: 0.005370 1981 vs 1945, p-valor: 0.003869 1981 vs 1946, p-valor: 0.020988 1981 vs 1949, p-valor: 0.033455 1981 vs 1955, p-valor: 0.010189 1981 vs 1970, p-valor: 0.006222 1981 vs 1972, p-valor: 0.010161 1981 vs 1973, p-valor: 0.046474 1986 vs 1900, p-valor: 0.005416 1986 vs 1910, p-valor: 0.000253 1986 vs 1920, p-valor: 0.000118 1986 vs 1922, p-valor: 0.018135 1986 vs 1924, p-valor: 0.005031 1986 vs 1925, p-valor: 0.013183 1986 vs 1930, p-valor: 0.008637 1986 vs 1945, p-valor: 0.006372 1986 vs 1946, p-valor: 0.035055 1986 vs 1955, p-valor: 0.016349 1986 vs 1970, p-valor: 0.009788 1986 vs 1972, p-valor: 0.016181 1988 vs 1900, p-valor: 0.001120 1988 vs 1910, p-valor: 0.000021 1988 vs 1920, p-valor: 0.000007 1988 vs 1922, p-valor: 0.007003 1988 vs 1924, p-valor: 0.001640 1988 vs 1925, p-valor: 0.002866 1988 vs 1926, p-valor: 0.039800 1988 vs 1930, p-valor: 0.002097 1988 vs 1941, p-valor: 0.048378 1988 vs 1945, p-valor: 0.002255 1988 vs 1946, p-valor: 0.015391 1988 vs 1947, p-valor: 0.049515 1988 vs 1949, p-valor: 0.023156 1988 vs 1955, p-valor: 0.003698 1988 vs 1970, p-valor: 0.001759 1988 vs 1972, p-valor: 0.003305 1988 vs 1973, p-valor: 0.030620 1989 vs 1910, p-valor: 0.023703 1989 vs 1920, p-valor: 0.015854 1990 vs 1900, p-valor: 0.000236 1990 vs 1910, p-valor: 0.000002 1990 vs 1920, p-valor: 0.000000 1990 vs 1922, p-valor: 0.002760 1990 vs 1924, p-valor: 0.000562 1990 vs 1925, p-valor: 0.000613 1990 vs 1926, p-valor: 0.016810 1990 vs 1930, p-valor: 0.000518 1990 vs 1940, p-valor: 0.029537 1990 vs 1941, p-valor: 0.018781 1990 vs 1945, p-valor: 0.000834 1990 vs 1946, p-valor: 0.006795 1990 vs 1947, p-valor: 0.028469 1990 vs 1948, p-valor: 0.039735 1990 vs 1949, p-valor: 0.009545 1990 vs 1950, p-valor: 0.016913 1990 vs 1952, p-valor: 0.030149 1990 vs 1954, p-valor: 0.035154 1990 vs 1955, p-valor: 0.000819 1990 vs 1970, p-valor: 0.000305 1990 vs 1971, p-valor: 0.035499 1990 vs 1972, p-valor: 0.000649 1990 vs 1973, p-valor: 0.011885 1992 vs 1900, p-valor: 0.000060 1992 vs 1910, p-valor: 0.000000 1992 vs 1920, p-valor: 0.000000 1992 vs 1922, p-valor: 0.001636 1992 vs 1924, p-valor: 0.000286 1992 vs 1925, p-valor: 0.000152 1992 vs 1926, p-valor: 0.010536 1992 vs 1930, p-valor: 0.000164 1992 vs 1940, p-valor: 0.012796 1992 vs 1941, p-valor: 0.010455 1992 vs 1945, p-valor: 0.000465 1992 vs 1946, p-valor: 0.004582 1992 vs 1947, p-valor: 0.025592 1992 vs 1948, p-valor: 0.021765 1992 vs 1949, p-valor: 0.005860 1992 vs 1950, p-valor: 0.006469 1992 vs 1952, p-valor: 0.020750 1992 vs 1954, p-valor: 0.013900 1992 vs 1955, p-valor: 0.000213 1992 vs 1956, p-valor: 0.032783 1992 vs 1958, p-valor: 0.025530 1992 vs 1970, p-valor: 0.000054 1992 vs 1971, p-valor: 0.014994 1992 vs 1972, p-valor: 0.000138 1992 vs 1973, p-valor: 0.006694 1993 vs 1900, p-valor: 0.000000 1993 vs 1910, p-valor: 0.000000 1993 vs 1915, p-valor: 0.000403 1993 vs 1920, p-valor: 0.000000 1993 vs 1922, p-valor: 0.000005 1993 vs 1923, p-valor: 0.007108 1993 vs 1924, p-valor: 0.000001 1993 vs 1925, p-valor: 0.000000 1993 vs 1926, p-valor: 0.000032 1993 vs 1930, p-valor: 0.000000 1993 vs 1938, p-valor: 0.001035 1993 vs 1939, p-valor: 0.000463 1993 vs 1940, p-valor: 0.000006 1993 vs 1941, p-valor: 0.000019 1993 vs 1945, p-valor: 0.000001 1993 vs 1946, p-valor: 0.000022 1993 vs 1947, p-valor: 0.000397 1993 vs 1948, p-valor: 0.000031 1993 vs 1949, p-valor: 0.000018 1993 vs 1950, p-valor: 0.000002 1993 vs 1951, p-valor: 0.000369 1993 vs 1952, p-valor: 0.000090 1993 vs 1953, p-valor: 0.000983 1993 vs 1954, p-valor: 0.000004 1993 vs 1955, p-valor: 0.000000 1993 vs 1956, p-valor: 0.000019 1993 vs 1957, p-valor: 0.008464 1993 vs 1958, p-valor: 0.000007 1993 vs 1959, p-valor: 0.002674 1993 vs 1960, p-valor: 0.045973 1993 vs 1961, p-valor: 0.000205 1993 vs 1962, p-valor: 0.000376 1993 vs 1963, p-valor: 0.000959 1993 vs 1965, p-valor: 0.008585 1993 vs 1967, p-valor: 0.003524 1993 vs 1968, p-valor: 0.018216 1993 vs 1970, p-valor: 0.000000 1993 vs 1971, p-valor: 0.000006 1993 vs 1972, p-valor: 0.000000 1993 vs 1973, p-valor: 0.000013 1993 vs 1975, p-valor: 0.023220 1994 vs 1900, p-valor: 0.000001 1994 vs 1910, p-valor: 0.000000 1994 vs 1915, p-valor: 0.010669 1994 vs 1920, p-valor: 0.000000 1994 vs 1922, p-valor: 0.000131 1994 vs 1924, p-valor: 0.000018 1994 vs 1925, p-valor: 0.000002 1994 vs 1926, p-valor: 0.000877 1994 vs 1930, p-valor: 0.000004 1994 vs 1938, p-valor: 0.013110 1994 vs 1939, p-valor: 0.009935 1994 vs 1940, p-valor: 0.000446 1994 vs 1941, p-valor: 0.000667 1994 vs 1945, p-valor: 0.000035 1994 vs 1946, p-valor: 0.000464 1994 vs 1947, p-valor: 0.004642 1994 vs 1948, p-valor: 0.001272 1994 vs 1949, p-valor: 0.000480 1994 vs 1950, p-valor: 0.000179 1994 vs 1951, p-valor: 0.007259 1994 vs 1952, p-valor: 0.002063 1994 vs 1953, p-valor: 0.023374 1994 vs 1954, p-valor: 0.000383 1994 vs 1955, p-valor: 0.000003 1994 vs 1956, p-valor: 0.001266 1994 vs 1958, p-valor: 0.000703 1994 vs 1961, p-valor: 0.008538 1994 vs 1962, p-valor: 0.014906 1994 vs 1963, p-valor: 0.033387 1994 vs 1970, p-valor: 0.000000 1994 vs 1971, p-valor: 0.000483 1994 vs 1972, p-valor: 0.000001 1994 vs 1973, p-valor: 0.000450 1995 vs 1900, p-valor: 0.000000 1995 vs 1910, p-valor: 0.000000 1995 vs 1915, p-valor: 0.000197 1995 vs 1920, p-valor: 0.000000 1995 vs 1922, p-valor: 0.000002 1995 vs 1923, p-valor: 0.003100 1995 vs 1924, p-valor: 0.000000 1995 vs 1925, p-valor: 0.000000 1995 vs 1926, p-valor: 0.000016 1995 vs 1930, p-valor: 0.000000 1995 vs 1936, p-valor: 0.027278 1995 vs 1938, p-valor: 0.000451 1995 vs 1939, p-valor: 0.000216 1995 vs 1940, p-valor: 0.000004 1995 vs 1941, p-valor: 0.000010 1995 vs 1945, p-valor: 0.000001 1995 vs 1946, p-valor: 0.000010 1995 vs 1947, p-valor: 0.000172 1995 vs 1948, p-valor: 0.000017 1995 vs 1949, p-valor: 0.000009 1995 vs 1950, p-valor: 0.000002 1995 vs 1951, p-valor: 0.000170 1995 vs 1952, p-valor: 0.000043 1995 vs 1953, p-valor: 0.000470 1995 vs 1954, p-valor: 0.000003 1995 vs 1955, p-valor: 0.000000 1995 vs 1956, p-valor: 0.000013 1995 vs 1957, p-valor: 0.004106 1995 vs 1958, p-valor: 0.000006 1995 vs 1959, p-valor: 0.001433 1995 vs 1960, p-valor: 0.021261 1995 vs 1961, p-valor: 0.000115 1995 vs 1962, p-valor: 0.000207 1995 vs 1963, p-valor: 0.000507 1995 vs 1965, p-valor: 0.004137 1995 vs 1967, p-valor: 0.001840 1995 vs 1968, p-valor: 0.009048 1995 vs 1970, p-valor: 0.000000 1995 vs 1971, p-valor: 0.000004 1995 vs 1972, p-valor: 0.000000 1995 vs 1973, p-valor: 0.000007 1995 vs 1975, p-valor: 0.010339 1995 vs 1976, p-valor: 0.044727 1996 vs 1900, p-valor: 0.000000 1996 vs 1910, p-valor: 0.000000 1996 vs 1915, p-valor: 0.002030 1996 vs 1920, p-valor: 0.000000 1996 vs 1922, p-valor: 0.000025 1996 vs 1923, p-valor: 0.022977 1996 vs 1924, p-valor: 0.000003 1996 vs 1925, p-valor: 0.000000 1996 vs 1926, p-valor: 0.000165 1996 vs 1930, p-valor: 0.000001 1996 vs 1938, p-valor: 0.003216 1996 vs 1939, p-valor: 0.002021 1996 vs 1940, p-valor: 0.000065 1996 vs 1941, p-valor: 0.000115 1996 vs 1945, p-valor: 0.000006 1996 vs 1946, p-valor: 0.000094 1996 vs 1947, p-valor: 0.001173 1996 vs 1948, p-valor: 0.000212 1996 vs 1949, p-valor: 0.000090 1996 vs 1950, p-valor: 0.000025 1996 vs 1951, p-valor: 0.001519 1996 vs 1952, p-valor: 0.000410 1996 vs 1953, p-valor: 0.004609 1996 vs 1954, p-valor: 0.000053 1996 vs 1955, p-valor: 0.000000 1996 vs 1956, p-valor: 0.000187 1996 vs 1957, p-valor: 0.041869 1996 vs 1958, p-valor: 0.000096 1996 vs 1959, p-valor: 0.016936 1996 vs 1961, p-valor: 0.001424 1996 vs 1962, p-valor: 0.002526 1996 vs 1963, p-valor: 0.005877 1996 vs 1965, p-valor: 0.041665 1996 vs 1967, p-valor: 0.021031 1996 vs 1970, p-valor: 0.000000 1996 vs 1971, p-valor: 0.000069 1996 vs 1972, p-valor: 0.000000 1996 vs 1973, p-valor: 0.000079 1997 vs 1900, p-valor: 0.000000 1997 vs 1910, p-valor: 0.000000 1997 vs 1915, p-valor: 0.001190 1997 vs 1920, p-valor: 0.000000 1997 vs 1922, p-valor: 0.000014 1997 vs 1923, p-valor: 0.015215 1997 vs 1924, p-valor: 0.000002 1997 vs 1925, p-valor: 0.000000 1997 vs 1926, p-valor: 0.000096 1997 vs 1930, p-valor: 0.000000 1997 vs 1938, p-valor: 0.002151 1997 vs 1939, p-valor: 0.001230 1997 vs 1940, p-valor: 0.000032 1997 vs 1941, p-valor: 0.000064 1997 vs 1945, p-valor: 0.000004 1997 vs 1946, p-valor: 0.000057 1997 vs 1947, p-valor: 0.000795 1997 vs 1948, p-valor: 0.000115 1997 vs 1949, p-valor: 0.000053 1997 vs 1950, p-valor: 0.000012 1997 vs 1951, p-valor: 0.000939 1997 vs 1952, p-valor: 0.000247 1997 vs 1953, p-valor: 0.002755 1997 vs 1954, p-valor: 0.000024 1997 vs 1955, p-valor: 0.000000 1997 vs 1956, p-valor: 0.000092 1997 vs 1957, p-valor: 0.024766 1997 vs 1958, p-valor: 0.000044 1997 vs 1959, p-valor: 0.009399 1997 vs 1961, p-valor: 0.000768 1997 vs 1962, p-valor: 0.001377 1997 vs 1963, p-valor: 0.003282 1997 vs 1965, p-valor: 0.024766 1997 vs 1967, p-valor: 0.011851 1997 vs 1970, p-valor: 0.000000 1997 vs 1971, p-valor: 0.000033 1997 vs 1972, p-valor: 0.000000 1997 vs 1973, p-valor: 0.000045 1998 vs 1900, p-valor: 0.000000 1998 vs 1910, p-valor: 0.000000 1998 vs 1915, p-valor: 0.000005 1998 vs 1916, p-valor: 0.044072 1998 vs 1920, p-valor: 0.000000 1998 vs 1922, p-valor: 0.000000 1998 vs 1923, p-valor: 0.000249 1998 vs 1924, p-valor: 0.000000 1998 vs 1925, p-valor: 0.000000 1998 vs 1926, p-valor: 0.000000 1998 vs 1927, p-valor: 0.017497 1998 vs 1930, p-valor: 0.000000 1998 vs 1936, p-valor: 0.005331 1998 vs 1938, p-valor: 0.000042 1998 vs 1939, p-valor: 0.000008 1998 vs 1940, p-valor: 0.000000 1998 vs 1941, p-valor: 0.000000 1998 vs 1945, p-valor: 0.000000 1998 vs 1946, p-valor: 0.000000 1998 vs 1947, p-valor: 0.000019 1998 vs 1948, p-valor: 0.000000 1998 vs 1949, p-valor: 0.000000 1998 vs 1950, p-valor: 0.000000 1998 vs 1951, p-valor: 0.000008 1998 vs 1952, p-valor: 0.000002 1998 vs 1953, p-valor: 0.000014 1998 vs 1954, p-valor: 0.000000 1998 vs 1955, p-valor: 0.000000 1998 vs 1956, p-valor: 0.000000 1998 vs 1957, p-valor: 0.000095 1998 vs 1958, p-valor: 0.000000 1998 vs 1959, p-valor: 0.000017 1998 vs 1960, p-valor: 0.000667 1998 vs 1961, p-valor: 0.000001 1998 vs 1962, p-valor: 0.000002 1998 vs 1963, p-valor: 0.000007 1998 vs 1964, p-valor: 0.008546 1998 vs 1965, p-valor: 0.000101 1998 vs 1966, p-valor: 0.007278 1998 vs 1967, p-valor: 0.000025 1998 vs 1968, p-valor: 0.000159 1998 vs 1970, p-valor: 0.000000 1998 vs 1971, p-valor: 0.000000 1998 vs 1972, p-valor: 0.000000 1998 vs 1973, p-valor: 0.000000 1998 vs 1975, p-valor: 0.000541 1998 vs 1976, p-valor: 0.000914 1998 vs 1977, p-valor: 0.025189 1999 vs 1900, p-valor: 0.000000 1999 vs 1910, p-valor: 0.000000 1999 vs 1915, p-valor: 0.001125 1999 vs 1920, p-valor: 0.000000 1999 vs 1922, p-valor: 0.000014 1999 vs 1923, p-valor: 0.020129 1999 vs 1924, p-valor: 0.000002 1999 vs 1925, p-valor: 0.000000 1999 vs 1926, p-valor: 0.000090 1999 vs 1930, p-valor: 0.000000 1999 vs 1938, p-valor: 0.002900 1999 vs 1939, p-valor: 0.001311 1999 vs 1940, p-valor: 0.000015 1999 vs 1941, p-valor: 0.000050 1999 vs 1945, p-valor: 0.000003 1999 vs 1946, p-valor: 0.000061 1999 vs 1947, p-valor: 0.001100 1999 vs 1948, p-valor: 0.000081 1999 vs 1949, p-valor: 0.000049 1999 vs 1950, p-valor: 0.000004 1999 vs 1951, p-valor: 0.001047 1999 vs 1952, p-valor: 0.000254 1999 vs 1953, p-valor: 0.002775 1999 vs 1954, p-valor: 0.000009 1999 vs 1955, p-valor: 0.000000 1999 vs 1956, p-valor: 0.000044 1999 vs 1957, p-valor: 0.023840 1999 vs 1958, p-valor: 0.000015 1999 vs 1959, p-valor: 0.007150 1999 vs 1961, p-valor: 0.000533 1999 vs 1962, p-valor: 0.000991 1999 vs 1963, p-valor: 0.002587 1999 vs 1965, p-valor: 0.024244 1999 vs 1967, p-valor: 0.009566 1999 vs 1970, p-valor: 0.000000 1999 vs 1971, p-valor: 0.000014 1999 vs 1972, p-valor: 0.000000 1999 vs 1973, p-valor: 0.000036 2000 vs 1900, p-valor: 0.000000 2000 vs 1910, p-valor: 0.000000 2000 vs 1915, p-valor: 0.000012 2000 vs 1920, p-valor: 0.000000 2000 vs 1922, p-valor: 0.000000 2000 vs 1923, p-valor: 0.000517 2000 vs 1924, p-valor: 0.000000 2000 vs 1925, p-valor: 0.000000 2000 vs 1926, p-valor: 0.000001 2000 vs 1927, p-valor: 0.029165 2000 vs 1930, p-valor: 0.000000 2000 vs 1936, p-valor: 0.009472 2000 vs 1938, p-valor: 0.000085 2000 vs 1939, p-valor: 0.000019 2000 vs 1940, p-valor: 0.000000 2000 vs 1941, p-valor: 0.000000 2000 vs 1945, p-valor: 0.000000 2000 vs 1946, p-valor: 0.000001 2000 vs 1947, p-valor: 0.000037 2000 vs 1948, p-valor: 0.000001 2000 vs 1949, p-valor: 0.000001 2000 vs 1950, p-valor: 0.000000 2000 vs 1951, p-valor: 0.000017 2000 vs 1952, p-valor: 0.000004 2000 vs 1953, p-valor: 0.000034 2000 vs 1954, p-valor: 0.000000 2000 vs 1955, p-valor: 0.000000 2000 vs 1956, p-valor: 0.000000 2000 vs 1957, p-valor: 0.000237 2000 vs 1958, p-valor: 0.000000 2000 vs 1959, p-valor: 0.000045 2000 vs 1960, p-valor: 0.001620 2000 vs 1961, p-valor: 0.000003 2000 vs 1962, p-valor: 0.000006 2000 vs 1963, p-valor: 0.000019 2000 vs 1964, p-valor: 0.018990 2000 vs 1965, p-valor: 0.000251 2000 vs 1966, p-valor: 0.016438 2000 vs 1967, p-valor: 0.000067 2000 vs 1968, p-valor: 0.000416 2000 vs 1970, p-valor: 0.000000 2000 vs 1971, p-valor: 0.000000 2000 vs 1972, p-valor: 0.000000 2000 vs 1973, p-valor: 0.000000 2000 vs 1975, p-valor: 0.001212 2000 vs 1976, p-valor: 0.002372 2001 vs 1900, p-valor: 0.000000 2001 vs 1910, p-valor: 0.000000 2001 vs 1915, p-valor: 0.000005 2001 vs 1916, p-valor: 0.024684 2001 vs 1920, p-valor: 0.000000 2001 vs 1921, p-valor: 0.028355 2001 vs 1922, p-valor: 0.000000 2001 vs 1923, p-valor: 0.000167 2001 vs 1924, p-valor: 0.000000 2001 vs 1925, p-valor: 0.000000 2001 vs 1926, p-valor: 0.000000 2001 vs 1927, p-valor: 0.009816 2001 vs 1930, p-valor: 0.000000 2001 vs 1931, p-valor: 0.031861 2001 vs 1936, p-valor: 0.003055 2001 vs 1938, p-valor: 0.000027 2001 vs 1939, p-valor: 0.000007 2001 vs 1940, p-valor: 0.000000 2001 vs 1941, p-valor: 0.000000 2001 vs 1945, p-valor: 0.000000 2001 vs 1946, p-valor: 0.000000 2001 vs 1947, p-valor: 0.000012 2001 vs 1948, p-valor: 0.000000 2001 vs 1949, p-valor: 0.000000 2001 vs 1950, p-valor: 0.000000 2001 vs 1951, p-valor: 0.000006 2001 vs 1952, p-valor: 0.000001 2001 vs 1953, p-valor: 0.000013 2001 vs 1954, p-valor: 0.000000 2001 vs 1955, p-valor: 0.000000 2001 vs 1956, p-valor: 0.000000 2001 vs 1957, p-valor: 0.000093 2001 vs 1958, p-valor: 0.000000 2001 vs 1959, p-valor: 0.000021 2001 vs 1960, p-valor: 0.000598 2001 vs 1961, p-valor: 0.000002 2001 vs 1962, p-valor: 0.000003 2001 vs 1963, p-valor: 0.000008 2001 vs 1964, p-valor: 0.006273 2001 vs 1965, p-valor: 0.000098 2001 vs 1966, p-valor: 0.005506 2001 vs 1967, p-valor: 0.000030 2001 vs 1968, p-valor: 0.000175 2001 vs 1969, p-valor: 0.047100 2001 vs 1970, p-valor: 0.000000 2001 vs 1971, p-valor: 0.000000 2001 vs 1972, p-valor: 0.000000 2001 vs 1973, p-valor: 0.000000 2001 vs 1975, p-valor: 0.000409 2001 vs 1976, p-valor: 0.000968 2001 vs 1977, p-valor: 0.020992 2002 vs 1900, p-valor: 0.000000 2002 vs 1910, p-valor: 0.000000 2002 vs 1915, p-valor: 0.000003 2002 vs 1916, p-valor: 0.030353 2002 vs 1920, p-valor: 0.000000 2002 vs 1921, p-valor: 0.034351 2002 vs 1922, p-valor: 0.000000 2002 vs 1923, p-valor: 0.000143 2002 vs 1924, p-valor: 0.000000 2002 vs 1925, p-valor: 0.000000 2002 vs 1926, p-valor: 0.000000 2002 vs 1927, p-valor: 0.012078 2002 vs 1930, p-valor: 0.000000 2002 vs 1931, p-valor: 0.041246 2002 vs 1936, p-valor: 0.003497 2002 vs 1938, p-valor: 0.000025 2002 vs 1939, p-valor: 0.000004 2002 vs 1940, p-valor: 0.000000 2002 vs 1941, p-valor: 0.000000 2002 vs 1945, p-valor: 0.000000 2002 vs 1946, p-valor: 0.000000 2002 vs 1947, p-valor: 0.000011 2002 vs 1948, p-valor: 0.000000 2002 vs 1949, p-valor: 0.000000 2002 vs 1950, p-valor: 0.000000 2002 vs 1951, p-valor: 0.000004 2002 vs 1952, p-valor: 0.000001 2002 vs 1953, p-valor: 0.000007 2002 vs 1954, p-valor: 0.000000 2002 vs 1955, p-valor: 0.000000 2002 vs 1956, p-valor: 0.000000 2002 vs 1957, p-valor: 0.000046 2002 vs 1958, p-valor: 0.000000 2002 vs 1959, p-valor: 0.000007 2002 vs 1960, p-valor: 0.000334 2002 vs 1961, p-valor: 0.000001 2002 vs 1962, p-valor: 0.000001 2002 vs 1963, p-valor: 0.000003 2002 vs 1964, p-valor: 0.004628 2002 vs 1965, p-valor: 0.000049 2002 vs 1966, p-valor: 0.003885 2002 vs 1967, p-valor: 0.000011 2002 vs 1968, p-valor: 0.000074 2002 vs 1969, p-valor: 0.043628 2002 vs 1970, p-valor: 0.000000 2002 vs 1971, p-valor: 0.000000 2002 vs 1972, p-valor: 0.000000 2002 vs 1973, p-valor: 0.000000 2002 vs 1975, p-valor: 0.000292 2002 vs 1976, p-valor: 0.000429 2002 vs 1977, p-valor: 0.012776 2003 vs 1900, p-valor: 0.000000 2003 vs 1910, p-valor: 0.000000 2003 vs 1915, p-valor: 0.000008 2003 vs 1920, p-valor: 0.000000 2003 vs 1922, p-valor: 0.000000 2003 vs 1923, p-valor: 0.000658 2003 vs 1924, p-valor: 0.000000 2003 vs 1925, p-valor: 0.000000 2003 vs 1926, p-valor: 0.000001 2003 vs 1930, p-valor: 0.000000 2003 vs 1936, p-valor: 0.016244 2003 vs 1938, p-valor: 0.000117 2003 vs 1939, p-valor: 0.000017 2003 vs 1940, p-valor: 0.000000 2003 vs 1941, p-valor: 0.000000 2003 vs 1945, p-valor: 0.000000 2003 vs 1946, p-valor: 0.000001 2003 vs 1947, p-valor: 0.000054 2003 vs 1948, p-valor: 0.000000 2003 vs 1949, p-valor: 0.000000 2003 vs 1950, p-valor: 0.000000 2003 vs 1951, p-valor: 0.000017 2003 vs 1952, p-valor: 0.000003 2003 vs 1953, p-valor: 0.000026 2003 vs 1954, p-valor: 0.000000 2003 vs 1955, p-valor: 0.000000 2003 vs 1956, p-valor: 0.000000 2003 vs 1957, p-valor: 0.000137 2003 vs 1958, p-valor: 0.000000 2003 vs 1959, p-valor: 0.000015 2003 vs 1960, p-valor: 0.001121 2003 vs 1961, p-valor: 0.000001 2003 vs 1962, p-valor: 0.000002 2003 vs 1963, p-valor: 0.000008 2003 vs 1964, p-valor: 0.019653 2003 vs 1965, p-valor: 0.000152 2003 vs 1966, p-valor: 0.015952 2003 vs 1967, p-valor: 0.000026 2003 vs 1968, p-valor: 0.000182 2003 vs 1970, p-valor: 0.000000 2003 vs 1971, p-valor: 0.000000 2003 vs 1972, p-valor: 0.000000 2003 vs 1973, p-valor: 0.000000 2003 vs 1975, p-valor: 0.001215 2003 vs 1976, p-valor: 0.001080 2003 vs 1977, p-valor: 0.045025 2004 vs 1900, p-valor: 0.000000 2004 vs 1910, p-valor: 0.000000 2004 vs 1915, p-valor: 0.000182 2004 vs 1920, p-valor: 0.000000 2004 vs 1922, p-valor: 0.000003 2004 vs 1923, p-valor: 0.007475 2004 vs 1924, p-valor: 0.000000 2004 vs 1925, p-valor: 0.000000 2004 vs 1926, p-valor: 0.000015 2004 vs 1930, p-valor: 0.000000 2004 vs 1938, p-valor: 0.001178 2004 vs 1939, p-valor: 0.000289 2004 vs 1940, p-valor: 0.000000 2004 vs 1941, p-valor: 0.000005 2004 vs 1945, p-valor: 0.000001 2004 vs 1946, p-valor: 0.000015 2004 vs 1947, p-valor: 0.000487 2004 vs 1948, p-valor: 0.000007 2004 vs 1949, p-valor: 0.000009 2004 vs 1950, p-valor: 0.000000 2004 vs 1951, p-valor: 0.000262 2004 vs 1952, p-valor: 0.000054 2004 vs 1953, p-valor: 0.000513 2004 vs 1954, p-valor: 0.000000 2004 vs 1955, p-valor: 0.000000 2004 vs 1956, p-valor: 0.000001 2004 vs 1957, p-valor: 0.003454 2004 vs 1958, p-valor: 0.000000 2004 vs 1959, p-valor: 0.000550 2004 vs 1960, p-valor: 0.024741 2004 vs 1961, p-valor: 0.000039 2004 vs 1962, p-valor: 0.000076 2004 vs 1963, p-valor: 0.000241 2004 vs 1965, p-valor: 0.003694 2004 vs 1967, p-valor: 0.000863 2004 vs 1968, p-valor: 0.005693 2004 vs 1970, p-valor: 0.000000 2004 vs 1971, p-valor: 0.000000 2004 vs 1972, p-valor: 0.000000 2004 vs 1973, p-valor: 0.000005 2004 vs 1975, p-valor: 0.018620 2004 vs 1976, p-valor: 0.033525 2005 vs 1900, p-valor: 0.000000 2005 vs 1910, p-valor: 0.000000 2005 vs 1915, p-valor: 0.000000 2005 vs 1916, p-valor: 0.040453 2005 vs 1920, p-valor: 0.000000 2005 vs 1921, p-valor: 0.043903 2005 vs 1922, p-valor: 0.000000 2005 vs 1923, p-valor: 0.000070 2005 vs 1924, p-valor: 0.000000 2005 vs 1925, p-valor: 0.000000 2005 vs 1926, p-valor: 0.000000 2005 vs 1927, p-valor: 0.016182 2005 vs 1930, p-valor: 0.000000 2005 vs 1936, p-valor: 0.003872 2005 vs 1938, p-valor: 0.000016 2005 vs 1939, p-valor: 0.000001 2005 vs 1940, p-valor: 0.000000 2005 vs 1941, p-valor: 0.000000 2005 vs 1945, p-valor: 0.000000 2005 vs 1946, p-valor: 0.000000 2005 vs 1947, p-valor: 0.000008 2005 vs 1948, p-valor: 0.000000 2005 vs 1949, p-valor: 0.000000 2005 vs 1950, p-valor: 0.000000 2005 vs 1951, p-valor: 0.000001 2005 vs 1952, p-valor: 0.000000 2005 vs 1953, p-valor: 0.000001 2005 vs 1954, p-valor: 0.000000 2005 vs 1955, p-valor: 0.000000 2005 vs 1956, p-valor: 0.000000 2005 vs 1957, p-valor: 0.000003 2005 vs 1958, p-valor: 0.000000 2005 vs 1959, p-valor: 0.000000 2005 vs 1960, p-valor: 0.000031 2005 vs 1961, p-valor: 0.000000 2005 vs 1962, p-valor: 0.000000 2005 vs 1963, p-valor: 0.000000 2005 vs 1964, p-valor: 0.001122 2005 vs 1965, p-valor: 0.000004 2005 vs 1966, p-valor: 0.000789 2005 vs 1967, p-valor: 0.000000 2005 vs 1968, p-valor: 0.000002 2005 vs 1969, p-valor: 0.022947 2005 vs 1970, p-valor: 0.000000 2005 vs 1971, p-valor: 0.000000 2005 vs 1972, p-valor: 0.000000 2005 vs 1973, p-valor: 0.000000 2005 vs 1975, p-valor: 0.000074 2005 vs 1976, p-valor: 0.000012 2005 vs 1977, p-valor: 0.001052 2006 vs 1900, p-valor: 0.000000 2006 vs 1910, p-valor: 0.000000 2006 vs 1914, p-valor: 0.035859 2006 vs 1915, p-valor: 0.000000 2006 vs 1916, p-valor: 0.002852 2006 vs 1920, p-valor: 0.000000 2006 vs 1921, p-valor: 0.002756 2006 vs 1922, p-valor: 0.000000 2006 vs 1923, p-valor: 0.000001 2006 vs 1924, p-valor: 0.000000 2006 vs 1925, p-valor: 0.000000 2006 vs 1926, p-valor: 0.000000 2006 vs 1927, p-valor: 0.001188 2006 vs 1930, p-valor: 0.000000 2006 vs 1931, p-valor: 0.007094 2006 vs 1936, p-valor: 0.000187 2006 vs 1938, p-valor: 0.000000 2006 vs 1939, p-valor: 0.000000 2006 vs 1940, p-valor: 0.000000 2006 vs 1941, p-valor: 0.000000 2006 vs 1945, p-valor: 0.000000 2006 vs 1946, p-valor: 0.000000 2006 vs 1947, p-valor: 0.000000 2006 vs 1948, p-valor: 0.000000 2006 vs 1949, p-valor: 0.000000 2006 vs 1950, p-valor: 0.000000 2006 vs 1951, p-valor: 0.000000 2006 vs 1952, p-valor: 0.000000 2006 vs 1953, p-valor: 0.000000 2006 vs 1954, p-valor: 0.000000 2006 vs 1955, p-valor: 0.000000 2006 vs 1956, p-valor: 0.000000 2006 vs 1957, p-valor: 0.000000 2006 vs 1958, p-valor: 0.000000 2006 vs 1959, p-valor: 0.000000 2006 vs 1960, p-valor: 0.000000 2006 vs 1961, p-valor: 0.000000 2006 vs 1962, p-valor: 0.000000 2006 vs 1963, p-valor: 0.000000 2006 vs 1964, p-valor: 0.000006 2006 vs 1965, p-valor: 0.000000 2006 vs 1966, p-valor: 0.000004 2006 vs 1967, p-valor: 0.000000 2006 vs 1968, p-valor: 0.000000 2006 vs 1969, p-valor: 0.000285 2006 vs 1970, p-valor: 0.000000 2006 vs 1971, p-valor: 0.000000 2006 vs 1972, p-valor: 0.000000 2006 vs 1973, p-valor: 0.000000 2006 vs 1975, p-valor: 0.000001 2006 vs 1976, p-valor: 0.000000 2006 vs 1977, p-valor: 0.000002 2006 vs 1978, p-valor: 0.002877 2006 vs 1979, p-valor: 0.027526 2006 vs 1980, p-valor: 0.015402 2006 vs 1982, p-valor: 0.042354 2006 vs 1984, p-valor: 0.041738 2007 vs 1900, p-valor: 0.000000 2007 vs 1910, p-valor: 0.000000 2007 vs 1914, p-valor: 0.018979 2007 vs 1915, p-valor: 0.000000 2007 vs 1916, p-valor: 0.001371 2007 vs 1920, p-valor: 0.000000 2007 vs 1921, p-valor: 0.001296 2007 vs 1922, p-valor: 0.000000 2007 vs 1923, p-valor: 0.000000 2007 vs 1924, p-valor: 0.000000 2007 vs 1925, p-valor: 0.000000 2007 vs 1926, p-valor: 0.000000 2007 vs 1927, p-valor: 0.000577 2007 vs 1930, p-valor: 0.000000 2007 vs 1931, p-valor: 0.003757 2007 vs 1936, p-valor: 0.000085 2007 vs 1938, p-valor: 0.000000 2007 vs 1939, p-valor: 0.000000 2007 vs 1940, p-valor: 0.000000 2007 vs 1941, p-valor: 0.000000 2007 vs 1945, p-valor: 0.000000 2007 vs 1946, p-valor: 0.000000 2007 vs 1947, p-valor: 0.000000 2007 vs 1948, p-valor: 0.000000 2007 vs 1949, p-valor: 0.000000 2007 vs 1950, p-valor: 0.000000 2007 vs 1951, p-valor: 0.000000 2007 vs 1952, p-valor: 0.000000 2007 vs 1953, p-valor: 0.000000 2007 vs 1954, p-valor: 0.000000 2007 vs 1955, p-valor: 0.000000 2007 vs 1956, p-valor: 0.000000 2007 vs 1957, p-valor: 0.000000 2007 vs 1958, p-valor: 0.000000 2007 vs 1959, p-valor: 0.000000 2007 vs 1960, p-valor: 0.000000 2007 vs 1961, p-valor: 0.000000 2007 vs 1962, p-valor: 0.000000 2007 vs 1963, p-valor: 0.000000 2007 vs 1964, p-valor: 0.000002 2007 vs 1965, p-valor: 0.000000 2007 vs 1966, p-valor: 0.000001 2007 vs 1967, p-valor: 0.000000 2007 vs 1968, p-valor: 0.000000 2007 vs 1969, p-valor: 0.000110 2007 vs 1970, p-valor: 0.000000 2007 vs 1971, p-valor: 0.000000 2007 vs 1972, p-valor: 0.000000 2007 vs 1973, p-valor: 0.000000 2007 vs 1975, p-valor: 0.000000 2007 vs 1976, p-valor: 0.000000 2007 vs 1977, p-valor: 0.000001 2007 vs 1978, p-valor: 0.001089 2007 vs 1979, p-valor: 0.011723 2007 vs 1980, p-valor: 0.006213 2007 vs 1982, p-valor: 0.023169 2007 vs 1984, p-valor: 0.018275 2008 vs 1900, p-valor: 0.000000 2008 vs 1910, p-valor: 0.000000 2008 vs 1912, p-valor: 0.009624 2008 vs 1914, p-valor: 0.001658 2008 vs 1915, p-valor: 0.000000 2008 vs 1916, p-valor: 0.000094 2008 vs 1920, p-valor: 0.000000 2008 vs 1921, p-valor: 0.000084 2008 vs 1922, p-valor: 0.000000 2008 vs 1923, p-valor: 0.000000 2008 vs 1924, p-valor: 0.000000 2008 vs 1925, p-valor: 0.000000 2008 vs 1926, p-valor: 0.000000 2008 vs 1927, p-valor: 0.000041 2008 vs 1928, p-valor: 0.020883 2008 vs 1929, p-valor: 0.016833 2008 vs 1930, p-valor: 0.000000 2008 vs 1931, p-valor: 0.000331 2008 vs 1935, p-valor: 0.022680 2008 vs 1936, p-valor: 0.000005 2008 vs 1937, p-valor: 0.018618 2008 vs 1938, p-valor: 0.000000 2008 vs 1939, p-valor: 0.000000 2008 vs 1940, p-valor: 0.000000 2008 vs 1941, p-valor: 0.000000 2008 vs 1942, p-valor: 0.016384 2008 vs 1945, p-valor: 0.000000 2008 vs 1946, p-valor: 0.000000 2008 vs 1947, p-valor: 0.000000 2008 vs 1948, p-valor: 0.000000 2008 vs 1949, p-valor: 0.000000 2008 vs 1950, p-valor: 0.000000 2008 vs 1951, p-valor: 0.000000 2008 vs 1952, p-valor: 0.000000 2008 vs 1953, p-valor: 0.000000 2008 vs 1954, p-valor: 0.000000 2008 vs 1955, p-valor: 0.000000 2008 vs 1956, p-valor: 0.000000 2008 vs 1957, p-valor: 0.000000 2008 vs 1958, p-valor: 0.000000 2008 vs 1959, p-valor: 0.000000 2008 vs 1960, p-valor: 0.000000 2008 vs 1961, p-valor: 0.000000 2008 vs 1962, p-valor: 0.000000 2008 vs 1963, p-valor: 0.000000 2008 vs 1964, p-valor: 0.000000 2008 vs 1965, p-valor: 0.000000 2008 vs 1966, p-valor: 0.000000 2008 vs 1967, p-valor: 0.000000 2008 vs 1968, p-valor: 0.000000 2008 vs 1969, p-valor: 0.000007 2008 vs 1970, p-valor: 0.000000 2008 vs 1971, p-valor: 0.000000 2008 vs 1972, p-valor: 0.000000 2008 vs 1973, p-valor: 0.000000 2008 vs 1974, p-valor: 0.022842 2008 vs 1975, p-valor: 0.000000 2008 vs 1976, p-valor: 0.000000 2008 vs 1977, p-valor: 0.000000 2008 vs 1978, p-valor: 0.000070 2008 vs 1979, p-valor: 0.000641 2008 vs 1980, p-valor: 0.000332 2008 vs 1982, p-valor: 0.002235 2008 vs 1984, p-valor: 0.001032 2009 vs 1900, p-valor: 0.000000 2009 vs 1910, p-valor: 0.000000 2009 vs 1915, p-valor: 0.000006 2009 vs 1916, p-valor: 0.013884 2009 vs 1920, p-valor: 0.000000 2009 vs 1921, p-valor: 0.016146 2009 vs 1922, p-valor: 0.000000 2009 vs 1923, p-valor: 0.000134 2009 vs 1924, p-valor: 0.000000 2009 vs 1925, p-valor: 0.000000 2009 vs 1926, p-valor: 0.000000 2009 vs 1927, p-valor: 0.005528 2009 vs 1930, p-valor: 0.000000 2009 vs 1931, p-valor: 0.017263 2009 vs 1936, p-valor: 0.001840 2009 vs 1938, p-valor: 0.000021 2009 vs 1939, p-valor: 0.000007 2009 vs 1940, p-valor: 0.000000 2009 vs 1941, p-valor: 0.000000 2009 vs 1945, p-valor: 0.000000 2009 vs 1946, p-valor: 0.000000 2009 vs 1947, p-valor: 0.000008 2009 vs 1948, p-valor: 0.000000 2009 vs 1949, p-valor: 0.000000 2009 vs 1950, p-valor: 0.000000 2009 vs 1951, p-valor: 0.000006 2009 vs 1952, p-valor: 0.000001 2009 vs 1953, p-valor: 0.000015 2009 vs 1954, p-valor: 0.000000 2009 vs 1955, p-valor: 0.000000 2009 vs 1956, p-valor: 0.000000 2009 vs 1957, p-valor: 0.000125 2009 vs 1958, p-valor: 0.000000 2009 vs 1959, p-valor: 0.000039 2009 vs 1960, p-valor: 0.000699 2009 vs 1961, p-valor: 0.000003 2009 vs 1962, p-valor: 0.000006 2009 vs 1963, p-valor: 0.000014 2009 vs 1964, p-valor: 0.005610 2009 vs 1965, p-valor: 0.000128 2009 vs 1966, p-valor: 0.005122 2009 vs 1967, p-valor: 0.000051 2009 vs 1968, p-valor: 0.000263 2009 vs 1969, p-valor: 0.033927 2009 vs 1970, p-valor: 0.000000 2009 vs 1971, p-valor: 0.000000 2009 vs 1972, p-valor: 0.000000 2009 vs 1973, p-valor: 0.000000 2009 vs 1975, p-valor: 0.000389 2009 vs 1976, p-valor: 0.001349 2009 vs 1977, p-valor: 0.021437
print('Núm. de pares com diferença significativa de distribuição:', len(years_diff))
Núm. de pares com diferença significativa de distribuição: 896
print('Média dos pares com diferença significativa de distribuição:', years_diff.mean())
Média dos pares com diferença significativa de distribuição: 53.447544642857146
sns.histplot(years_diff)
plt.title('Diferença de anos entre grupos significativamente diferentes')
plt.xlabel('Diferença')
plt.show()
Bairro¶
dunn_results = sp.posthoc_dunn(anova_data, val_col='SalePrice', group_col='Neighborhood', p_adjust='bonferroni')
dunn_results
| Blmngtn | Blueste | BrDale | BrkSide | ClearCr | CollgCr | Crawfor | Edwards | Gilbert | Greens | ... | NoRidge | NridgHt | OldTown | SWISU | Sawyer | SawyerW | Somerst | StoneBr | Timber | Veenker | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Blmngtn | 1.000000e+00 | 1.000000 | 9.336659e-11 | 3.584307e-09 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 3.523134e-09 | 1.000000e+00 | 1.000000 | ... | 3.665219e-02 | 5.923427e-02 | 2.646441e-11 | 9.456363e-05 | 1.703827e-06 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 |
| Blueste | 1.000000e+00 | 1.000000 | 1.000000e+00 | 1.000000e+00 | 4.592373e-01 | 5.618859e-01 | 7.166199e-01 | 1.000000e+00 | 8.425260e-01 | 1.000000 | ... | 1.989127e-06 | 3.239631e-06 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 8.614358e-03 | 1.063267e-04 | 4.498544e-03 | 2.206548e-02 |
| BrDale | 9.336659e-11 | 1.000000 | 1.000000e+00 | 1.000000e+00 | 5.686121e-14 | 3.652175e-19 | 1.792739e-16 | 1.000000e+00 | 2.036742e-17 | 0.000618 | ... | 4.292036e-35 | 1.756833e-39 | 1.000000e+00 | 1.000000e+00 | 1.265646e-01 | 1.364970e-12 | 2.698999e-26 | 5.615278e-27 | 1.379273e-23 | 5.861435e-15 |
| BrkSide | 3.584307e-09 | 1.000000 | 1.000000e+00 | 1.000000e+00 | 5.768801e-14 | 1.693476e-30 | 8.660557e-21 | 1.000000e+00 | 1.093177e-24 | 0.036354 | ... | 2.797663e-49 | 2.329096e-69 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 5.387953e-15 | 7.168848e-43 | 4.030548e-33 | 1.987813e-30 | 7.501357e-14 |
| ClearCr | 1.000000e+00 | 0.459237 | 5.686121e-14 | 5.768801e-14 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.201600e-14 | 1.000000e+00 | 1.000000 | ... | 4.672022e-03 | 4.684886e-03 | 4.943052e-18 | 6.357612e-07 | 1.886243e-10 | 1.000000e+00 | 1.000000e+00 | 6.754837e-01 | 1.000000e+00 | 1.000000e+00 |
| CollgCr | 1.000000e+00 | 0.561886 | 3.652175e-19 | 1.693476e-30 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.421044e-40 | 1.000000e+00 | 1.000000 | ... | 4.554860e-10 | 2.739583e-15 | 2.001527e-54 | 9.352812e-11 | 6.163716e-26 | 1.000000e+00 | 9.332788e-02 | 3.180049e-04 | 2.342212e-01 | 1.000000e+00 |
| Crawfor | 1.000000e+00 | 0.716620 | 1.792739e-16 | 8.660557e-21 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 3.794845e-24 | 1.000000e+00 | 1.000000 | ... | 3.644010e-07 | 5.891196e-09 | 5.993985e-31 | 1.577133e-08 | 2.819744e-16 | 1.000000e+00 | 1.000000e+00 | 4.815680e-03 | 1.000000e+00 | 1.000000e+00 |
| Edwards | 3.523134e-09 | 1.000000 | 1.000000e+00 | 1.000000e+00 | 1.201600e-14 | 1.421044e-40 | 3.794845e-24 | 1.000000e+00 | 1.214067e-30 | 0.060412 | ... | 1.713848e-56 | 2.233348e-89 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.488674e-17 | 4.494030e-55 | 2.747887e-36 | 2.000363e-34 | 5.229932e-14 |
| Gilbert | 1.000000e+00 | 0.842526 | 2.036742e-17 | 1.093177e-24 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.214067e-30 | 1.000000e+00 | 1.000000 | ... | 2.293923e-09 | 4.991593e-13 | 2.670839e-40 | 3.204717e-09 | 5.715235e-20 | 1.000000e+00 | 1.548179e-01 | 4.218710e-04 | 2.428358e-01 | 1.000000e+00 |
| Greens | 1.000000e+00 | 1.000000 | 6.181474e-04 | 3.635389e-02 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 6.041197e-02 | 1.000000e+00 | 1.000000 | ... | 1.000000e+00 | 1.000000e+00 | 1.452938e-02 | 5.769898e-01 | 3.899682e-01 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 |
| GrnHill | 1.000000e+00 | 1.000000 | 1.141549e-01 | 9.322844e-01 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000 | ... | 1.000000e+00 | 1.000000e+00 | 6.979386e-01 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 |
| IDOTRR | 9.122499e-14 | 1.000000 | 1.000000e+00 | 1.000000e+00 | 3.148248e-20 | 4.155253e-42 | 8.813349e-30 | 7.620792e-01 | 5.373154e-35 | 0.000755 | ... | 2.760155e-60 | 4.942471e-83 | 1.000000e+00 | 8.815607e-01 | 7.907737e-03 | 2.118375e-23 | 3.947905e-55 | 5.011745e-42 | 7.303296e-40 | 6.980476e-19 |
| Landmrk | 1.000000e+00 | 1.000000 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000 | ... | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 |
| MeadowV | 6.391656e-13 | 1.000000 | 1.000000e+00 | 1.000000e+00 | 4.064964e-17 | 3.503223e-25 | 4.588529e-21 | 2.234917e-01 | 1.162040e-22 | 0.000147 | ... | 9.881147e-43 | 1.012029e-49 | 1.000000e+00 | 1.692902e-01 | 6.627403e-03 | 1.687576e-16 | 1.083419e-33 | 1.711217e-32 | 3.938176e-29 | 1.691995e-17 |
| Mitchel | 2.955694e-01 | 1.000000 | 1.204245e-06 | 1.559545e-05 | 1.162310e-02 | 6.884492e-06 | 1.128940e-03 | 5.282711e-06 | 2.889674e-04 | 1.000000 | ... | 6.145876e-23 | 1.623349e-31 | 1.760483e-09 | 9.864561e-01 | 2.247056e-02 | 1.000000e+00 | 7.582467e-14 | 8.651061e-14 | 2.235770e-10 | 2.367492e-04 |
| NAmes | 2.748567e-05 | 1.000000 | 1.349748e-03 | 8.516410e-02 | 3.093443e-09 | 2.060533e-33 | 1.755291e-16 | 5.051462e-02 | 1.790958e-22 | 1.000000 | ... | 2.309426e-48 | 1.511075e-86 | 1.003794e-05 | 1.000000e+00 | 1.000000e+00 | 3.048591e-10 | 1.948688e-48 | 8.381649e-29 | 1.316665e-26 | 1.238243e-09 |
| NPkVill | 3.329496e-02 | 1.000000 | 1.000000e+00 | 1.000000e+00 | 3.907797e-03 | 9.123623e-04 | 3.004760e-03 | 1.000000e+00 | 2.820307e-03 | 1.000000 | ... | 7.375809e-14 | 1.297390e-14 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 2.236859e-01 | 1.850004e-07 | 5.590541e-10 | 2.486866e-07 | 7.998137e-05 |
| NWAmes | 1.000000e+00 | 1.000000 | 2.502562e-15 | 7.404183e-20 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.052528e-23 | 1.000000e+00 | 1.000000 | ... | 4.236182e-10 | 1.532858e-13 | 3.317715e-31 | 1.998047e-07 | 2.762726e-15 | 1.000000e+00 | 3.000000e-02 | 9.074611e-05 | 5.958782e-02 | 1.000000e+00 |
| NoRidge | 3.665219e-02 | 0.000002 | 4.292036e-35 | 2.797663e-49 | 4.672022e-03 | 4.554860e-10 | 3.644010e-07 | 1.713848e-56 | 2.293923e-09 | 1.000000 | ... | 1.000000e+00 | 1.000000e+00 | 5.262707e-66 | 1.249601e-26 | 1.258259e-44 | 3.564922e-13 | 7.660108e-03 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 |
| NridgHt | 5.923427e-02 | 0.000003 | 1.756833e-39 | 2.329096e-69 | 4.684886e-03 | 2.739583e-15 | 5.891196e-09 | 2.233348e-89 | 4.991593e-13 | 1.000000 | ... | 1.000000e+00 | 1.000000e+00 | 5.160086e-109 | 1.230181e-31 | 9.757513e-67 | 7.886828e-18 | 1.271362e-03 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 |
| OldTown | 2.646441e-11 | 1.000000 | 1.000000e+00 | 1.000000e+00 | 4.943052e-18 | 2.001527e-54 | 5.993985e-31 | 1.000000e+00 | 2.670839e-40 | 0.014529 | ... | 5.262707e-66 | 5.160086e-109 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 9.671637e-24 | 9.961729e-70 | 2.337324e-42 | 1.802204e-41 | 2.065076e-16 |
| SWISU | 9.456363e-05 | 1.000000 | 1.000000e+00 | 1.000000e+00 | 6.357612e-07 | 9.352812e-11 | 1.577133e-08 | 1.000000e+00 | 3.204717e-09 | 0.576990 | ... | 1.249601e-26 | 1.230181e-31 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 4.044487e-05 | 8.942063e-18 | 1.283292e-18 | 3.060715e-15 | 2.201093e-08 |
| Sawyer | 1.703827e-06 | 1.000000 | 1.265646e-01 | 1.000000e+00 | 1.886243e-10 | 6.163716e-26 | 2.819744e-16 | 1.000000e+00 | 5.715235e-20 | 0.389968 | ... | 1.258259e-44 | 9.757513e-67 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.096960e-10 | 1.216504e-38 | 1.364148e-28 | 8.404259e-26 | 6.974575e-11 |
| SawyerW | 1.000000e+00 | 1.000000 | 1.364970e-12 | 5.387953e-15 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.488674e-17 | 1.000000e+00 | 1.000000 | ... | 3.564922e-13 | 7.886828e-18 | 9.671637e-24 | 4.044487e-05 | 1.096960e-10 | 1.000000e+00 | 1.015835e-04 | 7.185069e-07 | 8.494246e-04 | 3.701389e-01 |
| Somerst | 1.000000e+00 | 0.008614 | 2.698999e-26 | 7.168848e-43 | 1.000000e+00 | 9.332788e-02 | 1.000000e+00 | 4.494030e-55 | 1.548179e-01 | 1.000000 | ... | 7.660108e-03 | 1.271362e-03 | 9.961729e-70 | 8.942063e-18 | 1.216504e-38 | 1.015835e-04 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 |
| StoneBr | 1.000000e+00 | 0.000106 | 5.615278e-27 | 4.030548e-33 | 6.754837e-01 | 3.180049e-04 | 4.815680e-03 | 2.747887e-36 | 4.218710e-04 | 1.000000 | ... | 1.000000e+00 | 1.000000e+00 | 2.337324e-42 | 1.283292e-18 | 1.364148e-28 | 7.185069e-07 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 |
| Timber | 1.000000e+00 | 0.004499 | 1.379273e-23 | 1.987813e-30 | 1.000000e+00 | 2.342212e-01 | 1.000000e+00 | 2.000363e-34 | 2.428358e-01 | 1.000000 | ... | 1.000000e+00 | 1.000000e+00 | 1.802204e-41 | 3.060715e-15 | 8.404259e-26 | 8.494246e-04 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 |
| Veenker | 1.000000e+00 | 0.022065 | 5.861435e-15 | 7.501357e-14 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 5.229932e-14 | 1.000000e+00 | 1.000000 | ... | 1.000000e+00 | 1.000000e+00 | 2.065076e-16 | 2.201093e-08 | 6.974575e-11 | 3.701389e-01 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 |
28 rows × 28 columns
print('Distribuições significativamente diferentes (Bairro):')
mask = (dunn_results < 0.05) & (dunn_results != 1)
num_neighborhoods_diff = 0
for i in range(len(dunn_results)):
for j in range(i):
if mask.iloc[i, j]:
num_neighborhoods_diff += 1
print(f'{dunn_results.index[i]} vs {dunn_results.index[j]}, p-valor: {dunn_results.iloc[i, j]:.6f}')
Distribuições significativamente diferentes (Bairro): BrDale vs Blmngtn, p-valor: 0.000000 BrkSide vs Blmngtn, p-valor: 0.000000 ClearCr vs BrDale, p-valor: 0.000000 ClearCr vs BrkSide, p-valor: 0.000000 CollgCr vs BrDale, p-valor: 0.000000 CollgCr vs BrkSide, p-valor: 0.000000 Crawfor vs BrDale, p-valor: 0.000000 Crawfor vs BrkSide, p-valor: 0.000000 Edwards vs Blmngtn, p-valor: 0.000000 Edwards vs ClearCr, p-valor: 0.000000 Edwards vs CollgCr, p-valor: 0.000000 Edwards vs Crawfor, p-valor: 0.000000 Gilbert vs BrDale, p-valor: 0.000000 Gilbert vs BrkSide, p-valor: 0.000000 Gilbert vs Edwards, p-valor: 0.000000 Greens vs BrDale, p-valor: 0.000618 Greens vs BrkSide, p-valor: 0.036354 IDOTRR vs Blmngtn, p-valor: 0.000000 IDOTRR vs ClearCr, p-valor: 0.000000 IDOTRR vs CollgCr, p-valor: 0.000000 IDOTRR vs Crawfor, p-valor: 0.000000 IDOTRR vs Gilbert, p-valor: 0.000000 IDOTRR vs Greens, p-valor: 0.000755 MeadowV vs Blmngtn, p-valor: 0.000000 MeadowV vs ClearCr, p-valor: 0.000000 MeadowV vs CollgCr, p-valor: 0.000000 MeadowV vs Crawfor, p-valor: 0.000000 MeadowV vs Gilbert, p-valor: 0.000000 MeadowV vs Greens, p-valor: 0.000147 Mitchel vs BrDale, p-valor: 0.000001 Mitchel vs BrkSide, p-valor: 0.000016 Mitchel vs ClearCr, p-valor: 0.011623 Mitchel vs CollgCr, p-valor: 0.000007 Mitchel vs Crawfor, p-valor: 0.001129 Mitchel vs Edwards, p-valor: 0.000005 Mitchel vs Gilbert, p-valor: 0.000289 Mitchel vs IDOTRR, p-valor: 0.000000 Mitchel vs MeadowV, p-valor: 0.000000 NAmes vs Blmngtn, p-valor: 0.000027 NAmes vs BrDale, p-valor: 0.001350 NAmes vs ClearCr, p-valor: 0.000000 NAmes vs CollgCr, p-valor: 0.000000 NAmes vs Crawfor, p-valor: 0.000000 NAmes vs Gilbert, p-valor: 0.000000 NAmes vs IDOTRR, p-valor: 0.000000 NAmes vs MeadowV, p-valor: 0.000013 NPkVill vs Blmngtn, p-valor: 0.033295 NPkVill vs ClearCr, p-valor: 0.003908 NPkVill vs CollgCr, p-valor: 0.000912 NPkVill vs Crawfor, p-valor: 0.003005 NPkVill vs Gilbert, p-valor: 0.002820 NWAmes vs BrDale, p-valor: 0.000000 NWAmes vs BrkSide, p-valor: 0.000000 NWAmes vs Edwards, p-valor: 0.000000 NWAmes vs IDOTRR, p-valor: 0.000000 NWAmes vs MeadowV, p-valor: 0.000000 NWAmes vs Mitchel, p-valor: 0.013311 NWAmes vs NAmes, p-valor: 0.000000 NWAmes vs NPkVill, p-valor: 0.016246 NoRidge vs Blmngtn, p-valor: 0.036652 NoRidge vs Blueste, p-valor: 0.000002 NoRidge vs BrDale, p-valor: 0.000000 NoRidge vs BrkSide, p-valor: 0.000000 NoRidge vs ClearCr, p-valor: 0.004672 NoRidge vs CollgCr, p-valor: 0.000000 NoRidge vs Crawfor, p-valor: 0.000000 NoRidge vs Edwards, p-valor: 0.000000 NoRidge vs Gilbert, p-valor: 0.000000 NoRidge vs IDOTRR, p-valor: 0.000000 NoRidge vs MeadowV, p-valor: 0.000000 NoRidge vs Mitchel, p-valor: 0.000000 NoRidge vs NAmes, p-valor: 0.000000 NoRidge vs NPkVill, p-valor: 0.000000 NoRidge vs NWAmes, p-valor: 0.000000 NridgHt vs Blueste, p-valor: 0.000003 NridgHt vs BrDale, p-valor: 0.000000 NridgHt vs BrkSide, p-valor: 0.000000 NridgHt vs ClearCr, p-valor: 0.004685 NridgHt vs CollgCr, p-valor: 0.000000 NridgHt vs Crawfor, p-valor: 0.000000 NridgHt vs Edwards, p-valor: 0.000000 NridgHt vs Gilbert, p-valor: 0.000000 NridgHt vs IDOTRR, p-valor: 0.000000 NridgHt vs MeadowV, p-valor: 0.000000 NridgHt vs Mitchel, p-valor: 0.000000 NridgHt vs NAmes, p-valor: 0.000000 NridgHt vs NPkVill, p-valor: 0.000000 NridgHt vs NWAmes, p-valor: 0.000000 OldTown vs Blmngtn, p-valor: 0.000000 OldTown vs ClearCr, p-valor: 0.000000 OldTown vs CollgCr, p-valor: 0.000000 OldTown vs Crawfor, p-valor: 0.000000 OldTown vs Gilbert, p-valor: 0.000000 OldTown vs Greens, p-valor: 0.014529 OldTown vs Mitchel, p-valor: 0.000000 OldTown vs NAmes, p-valor: 0.000010 OldTown vs NWAmes, p-valor: 0.000000 OldTown vs NoRidge, p-valor: 0.000000 OldTown vs NridgHt, p-valor: 0.000000 SWISU vs Blmngtn, p-valor: 0.000095 SWISU vs ClearCr, p-valor: 0.000001 SWISU vs CollgCr, p-valor: 0.000000 SWISU vs Crawfor, p-valor: 0.000000 SWISU vs Gilbert, p-valor: 0.000000 SWISU vs NWAmes, p-valor: 0.000000 SWISU vs NoRidge, p-valor: 0.000000 SWISU vs NridgHt, p-valor: 0.000000 Sawyer vs Blmngtn, p-valor: 0.000002 Sawyer vs ClearCr, p-valor: 0.000000 Sawyer vs CollgCr, p-valor: 0.000000 Sawyer vs Crawfor, p-valor: 0.000000 Sawyer vs Gilbert, p-valor: 0.000000 Sawyer vs IDOTRR, p-valor: 0.007908 Sawyer vs MeadowV, p-valor: 0.006627 Sawyer vs Mitchel, p-valor: 0.022471 Sawyer vs NWAmes, p-valor: 0.000000 Sawyer vs NoRidge, p-valor: 0.000000 Sawyer vs NridgHt, p-valor: 0.000000 SawyerW vs BrDale, p-valor: 0.000000 SawyerW vs BrkSide, p-valor: 0.000000 SawyerW vs Edwards, p-valor: 0.000000 SawyerW vs IDOTRR, p-valor: 0.000000 SawyerW vs MeadowV, p-valor: 0.000000 SawyerW vs NAmes, p-valor: 0.000000 SawyerW vs NoRidge, p-valor: 0.000000 SawyerW vs NridgHt, p-valor: 0.000000 SawyerW vs OldTown, p-valor: 0.000000 SawyerW vs SWISU, p-valor: 0.000040 SawyerW vs Sawyer, p-valor: 0.000000 Somerst vs Blueste, p-valor: 0.008614 Somerst vs BrDale, p-valor: 0.000000 Somerst vs BrkSide, p-valor: 0.000000 Somerst vs Edwards, p-valor: 0.000000 Somerst vs IDOTRR, p-valor: 0.000000 Somerst vs MeadowV, p-valor: 0.000000 Somerst vs Mitchel, p-valor: 0.000000 Somerst vs NAmes, p-valor: 0.000000 Somerst vs NPkVill, p-valor: 0.000000 Somerst vs NWAmes, p-valor: 0.030000 Somerst vs NoRidge, p-valor: 0.007660 Somerst vs NridgHt, p-valor: 0.001271 Somerst vs OldTown, p-valor: 0.000000 Somerst vs SWISU, p-valor: 0.000000 Somerst vs Sawyer, p-valor: 0.000000 Somerst vs SawyerW, p-valor: 0.000102 StoneBr vs Blueste, p-valor: 0.000106 StoneBr vs BrDale, p-valor: 0.000000 StoneBr vs BrkSide, p-valor: 0.000000 StoneBr vs CollgCr, p-valor: 0.000318 StoneBr vs Crawfor, p-valor: 0.004816 StoneBr vs Edwards, p-valor: 0.000000 StoneBr vs Gilbert, p-valor: 0.000422 StoneBr vs IDOTRR, p-valor: 0.000000 StoneBr vs MeadowV, p-valor: 0.000000 StoneBr vs Mitchel, p-valor: 0.000000 StoneBr vs NAmes, p-valor: 0.000000 StoneBr vs NPkVill, p-valor: 0.000000 StoneBr vs NWAmes, p-valor: 0.000091 StoneBr vs OldTown, p-valor: 0.000000 StoneBr vs SWISU, p-valor: 0.000000 StoneBr vs Sawyer, p-valor: 0.000000 StoneBr vs SawyerW, p-valor: 0.000001 Timber vs Blueste, p-valor: 0.004499 Timber vs BrDale, p-valor: 0.000000 Timber vs BrkSide, p-valor: 0.000000 Timber vs Edwards, p-valor: 0.000000 Timber vs IDOTRR, p-valor: 0.000000 Timber vs MeadowV, p-valor: 0.000000 Timber vs Mitchel, p-valor: 0.000000 Timber vs NAmes, p-valor: 0.000000 Timber vs NPkVill, p-valor: 0.000000 Timber vs OldTown, p-valor: 0.000000 Timber vs SWISU, p-valor: 0.000000 Timber vs Sawyer, p-valor: 0.000000 Timber vs SawyerW, p-valor: 0.000849 Veenker vs Blueste, p-valor: 0.022065 Veenker vs BrDale, p-valor: 0.000000 Veenker vs BrkSide, p-valor: 0.000000 Veenker vs Edwards, p-valor: 0.000000 Veenker vs IDOTRR, p-valor: 0.000000 Veenker vs MeadowV, p-valor: 0.000000 Veenker vs Mitchel, p-valor: 0.000237 Veenker vs NAmes, p-valor: 0.000000 Veenker vs NPkVill, p-valor: 0.000080 Veenker vs OldTown, p-valor: 0.000000 Veenker vs SWISU, p-valor: 0.000000 Veenker vs Sawyer, p-valor: 0.000000
print('Número de pares distintos de bairros:', 28*27/2)
print('Número de pares com diferença de distribuição de preços significativa:', num_neighborhoods_diff)
print(f'% pares com diferença de distribuição de preços significativa: {100*num_neighborhoods_diff/(28*27/2):.2f}%')
Número de pares distintos de bairros: 378.0 Número de pares com diferença de distribuição de preços significativa: 187 % pares com diferença de distribuição de preços significativa: 49.47%
Conclusões¶
Análise exploratória¶
- Muitas features apresentam valores zerados, em grande parte por ausência de tal aspecto no imóvel (muitos registros com área da piscina zerada ou sem garagem, colocando tipo da garagem como "None", por exemplo);
- Poucas features numéricas possuem correlação acima de 0.5 com o valor de venda. São features relacionadas à área do imóvel (área de revestimento de alvenaria, número de banheiros completos, área do primeiro piso, número de vagas, área do porão, da garagem e da área de convivência), aos anos de contrução ou reforma e qualidade geral do imóvel, dado de 1 a 10;
- Já a correlação entre as features nos dá algumas informações interessantes:
- A qualidade geral ("Overal qual") está fortemente correlacionada com o ano de construção e a capacidade da garagem;
- A área da piscina (que está igual a 0 para quase todos os imóveis) e o mês da venda tem correlação nula com praticamente todas as outras features;
- O tamanho da área de convivência tem correlação bastante alta (> 0.8) com o número de cômodos;
- A área do primeiro piso tem correlação bastante alta (0.8) com a área do porão;
- Forte correlação negativa entre “Bsmt Unf SF” (espaço do porão inacabado) e “BsmtFin SF 1” (espaço do porão acabado), indicando (de forma até óbvia) que à medida que a área do porão acabado aumenta, a área do porão inacabado diminui.
ANOVA¶
Os pressupostos necessários para realizar o teste ANOVA foram verificados e apresentaram os seguintes resultados:
Normalidade: verificada por meio de gráficos Q-Q plots e pelo teste de Shapiro-Wilk. Esses métodos mostraram que os dados não seguem uma distribuição normal para todos os níveis dos grupos. Nos Q-Q plots, especialmente nos quantis superiores, as observações se desviaram da linha diagonal, sugerindo a presença de caudas pesadas e valores extremos (outliers).
Homocedasticidade: testada por meio do teste de Levene. Os resultados indicaram que as variâncias não são homogêneas entre os grupos, violando o pressuposto de homocedasticidade.
Independência dos Erros: foi avaliada por meio do gráfico de resíduos (residual plot) e de Q-Q plots dos resíduos. A análise dos gráficos revelou padrões e a presença de outliers, especialmente em valores extremos, sugerindo que os erros não são independentes.
Teste não-paramétrico (Kruskal-Wallis)¶
Como os pressupostos do ANOVA não são seguidos pelo dado, para verificar se há diferenças significativas entre os grupos em relação ao preço de venda, o teste não-paramétrico de Kruskal-Wallis foi feito. Esse teste é uma alternativa robusta à ANOVA quando os pressupostos de normalidade e homocedasticidade não são atendidos. O teste avalia se as amostras provêm da mesma distribuição ou de distribuições diferentes.
Os resultados foram:
Número de vagas na garagem: O teste de Kruskal-Wallis para o número de vagas resultou na rejeição da hipótese nula (H₀). Isso indica que pelo menos um dos grupos possui uma distribuição de preços de venda significativamente diferente.
Bairro: Para a variável Bairro, o teste também resultou na rejeição da hipótese nula (H₀), sugerindo que os preços de venda variam significativamente entre diferentes bairros.
Ano de construção: Da mesma forma, o teste aplicado ao Ano de construção rejeitou a hipótese nula (H₀). Esse resultado implica que há pelo menos um grupo com ano de construção diferente que apresenta uma distribuição distinta de preços de venda.
Teste pós-hoc (Dunn)¶
Número de vagas¶
O teste de Dunn para o número de vagas na garagem indica que quase todos os pares de grupos apresentam distribuições significativamente diferentes, exceto entre os grupos com 2 e 3 vagas e 2 e 4 vagas, onde não foi encontrada diferença estatisticamente significativa.
A comparação com o grupo de imóveis com 5 vagas deve ser interpretada com cautela, pois este grupo contém apenas uma observação, o que torna a comparação pouco confiável.
Em resumo, os resultados sugerem que o número de vagas na garagem influencia significativamente o preço de venda dos imóveis, especialmente quando há uma grande discrepância entre os grupos (por exemplo, imóveis com 0 vagas comparados a imóveis com 4 vagas). Diferenças maiores no número de vagas tendem a estar associadas a diferenças maiores nos preços dos imóveis.
Ano de construção¶
Para os anos de construção, dos 6903 possíveis pares de anos ($\frac{118*117}{2}$), o teste de Dunn encontrou apenas 896 (~ 12% dos pares) ses grupos, percebe-se que a média é cerca de 53 anos.
Dessa forma, conclui-se que, em geral, o ano não determina tão fortemente o preço de venda. Mas quando isso ocorre, a diferença entre a idade dos imóveis é frequentemente grande (em média, 53 anos)
Bairro¶
Para os bairros, 50% dos pares possuem diferença significativa entre as distribuições. Isso indica que o bairro é um fator bastante determinante para o valor de venda. Uma outra análise que poderia ser feita é analisar a distância entre os bairros, testando a hipótese de que para os pares de bairros com diferença não significativa a distância média é menor.
Referências bibliográficas¶
- [1] The Ames housing dataset (scikit-learn)
- [2] Ames, Iowa: Alternative to the Boston Housing Data as an End of Semester Regression Project
- [3] CAMPOS, Vinicius. Análise de Variância (ANOVA). Universidade Federal de Pelotas.
- [4] Repeated Measures ANOVA. The University of Texas at Austin
- [5] ANOVA Test: An In-Depth Guide with Examples
- [6] How to Use Q-Q Plots to Check Normality
- [7] Teste de Shapiro-Wilk. Universidade Estadual de Londrina
- [8] Dunn’s Test for Multiple Comparisons